From 9d19ed12279b748a27867ddda5177cb5ff497bb4 Mon Sep 17 00:00:00 2001 From: benoitlaurent96 <132939700+benoitlaurent96@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:50:26 -0400 Subject: [PATCH 01/24] Merge pull request #5 from Wall-Go/linearisation Implemented the new linearisation criterion --- src/WallGo/boltzmann.py | 116 +++++++++++++++++---------------- src/WallGo/equationOfMotion.py | 9 ++- src/WallGo/results.py | 27 ++++---- 3 files changed, 80 insertions(+), 72 deletions(-) diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index e6668a91..16b57d5a 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -117,7 +117,9 @@ def updateParticleList(self, offEqParticles: list[Particle]) -> None: self.offEqParticles = offEqParticles - def getDeltas(self, deltaF: typing.Optional[np.ndarray] = None) -> BoltzmannResults: + def getDeltas(self, + deltaF: typing.Optional[np.ndarray] = None, + ) -> BoltzmannResults: """ Computes Deltas necessary for solving the Higgs equation of motion. @@ -142,9 +144,6 @@ def getDeltas(self, deltaF: typing.Optional[np.ndarray] = None) -> BoltzmannResu # getting (optimistic) estimate of truncation error truncationError = self.estimateTruncationError(deltaF) - # getting criteria for validity of linearization - criterion1, criterion2 = self.checkLinearization(deltaF) - particles = self.offEqParticles # constructing Polynomial class from deltaF array @@ -202,8 +201,6 @@ def getDeltas(self, deltaF: typing.Optional[np.ndarray] = None) -> BoltzmannResu deltaF=deltaF, Deltas=Deltas, truncationError=truncationError, - linearizationCriterion1=criterion1, - linearizationCriterion2=criterion2, ) def solveBoltzmannEquations(self) -> np.ndarray: @@ -315,10 +312,12 @@ def estimateTruncationError(self, deltaF: np.ndarray) -> float: def checkLinearization( self, deltaF: typing.Optional[np.ndarray] = None - ) -> tuple[np.ndarray, np.ndarray]: + ) -> tuple[float, float]: r""" - Compute two criteria to verify the validity of the linearization of the - Boltzmann equation: :math:`\delta f/f_{eq}` and :math:`C[\delta f]/L[\delta f]`. + Compute two criteria to verify the validity of the linearisation of the + Boltzmann equation: :math:`\delta f/f_{eq}` and + :math:`\delta f_2/(f_{eq}+\delta f)`, with :math:`\delta f_2` the first-order + correction due to nonlinearities. To be valid, at least one of the two criteria must be small for each particle. Parameters @@ -347,6 +346,35 @@ def checkLinearization( False, ) deltaFPoly.changeBasis(("Array", "Cardinal", "Cardinal", "Cardinal")) + + # Computing \delta f^2 + deltaFSqPoly = deltaFPoly*deltaFPoly + deltaFSqPoly.changeBasis(("Array", self.basisM, self.basisN, self.basisN)) + + + operator, _, _, collision = self.buildLinearEquations() + source = np.sum( + collision*deltaFSqPoly.coefficients[None,None,None,None,...], + axis=(4,5,6,7)) + + # Computing the correction from nonlinear terms + deltaNonlin = np.linalg.solve(operator, + np.reshape(source, source.size, order="C")) + deltaNonlinShape = ( + len(self.offEqParticles), + self.grid.M - 1, + self.grid.N - 1, + self.grid.N - 1, + ) + deltaNonlin = np.reshape(deltaNonlin, deltaNonlinShape, order="C") + deltaNonlinPoly = Polynomial( + coefficients=deltaNonlin, + grid=self.grid, + basis=("Array", self.basisM, self.basisN, self.basisN), + direction=("z", "z", "pz", "pp"), + endpoints=False, + ) + deltaNonlinPoly.changeBasis(("Array", "Cardinal", "Cardinal", "Cardinal")) msqFull = np.array( [ @@ -354,14 +382,15 @@ def checkLinearization( for particle in particles ] ) - fieldPoly = Polynomial( - np.sum(self.background.fieldProfiles, axis=1), + + msqPoly = Polynomial( + msqFull, self.grid, - "Cardinal", - "z", + ('Array', 'Cardinal'), + 'z', True, - ) - dfielddChi = fieldPoly.derivative(0).coefficients[None, 1:-1, None, None] + ) + dmsqdChi = msqPoly.derivative(axis=1).coefficients[:,1:-1,None,None] # adding new axes, to make everything rank 3 like deltaF (z, pz, pp) # for fast multiplication of arrays, using numpy's broadcasting rules @@ -389,45 +418,22 @@ def checkLinearization( dpzdrz = dpzdrz[None, None, :, None] dppdrp = dppdrp[None, None, None, :] - # base integrand, for '00' - integrand = dfielddChi * dpzdrz * dppdrp * pp / (4 * np.pi**2 * energy) - - # The first criterion is to require that pressureOut/pressureEq is small - pressureOut = deltaFPoly.integrate((1, 2, 3), integrand).coefficients - pressureEq = fEqPoly.integrate((1, 2, 3), integrand).coefficients - deltaFCriterion = pressureOut / pressureEq - - # If criterion1 is large, we need C[deltaF]/L[deltaF] to be small - _, _, liouville, collision = self.buildLinearEquations() - collisionDeltaF = np.sum( - collision * deltaF[None, None, None, None, ...], axis=(4, 5, 6, 7) - ) - liouvilleDeltaF = np.sum( - liouville * deltaF[None, None, None, None, ...], axis=(4, 5, 6, 7) - ) - collisionDeltaFPoly = Polynomial( - collisionDeltaF, - self.grid, - ("Array", "Cardinal", "Cardinal", "Cardinal"), - ("z", "z", "pz", "pp"), - False, - ) - lioviilleDeltaFPoly = Polynomial( - liouvilleDeltaF, - self.grid, - ("Array", "Cardinal", "Cardinal", "Cardinal"), - ("z", "z", "pz", "pp"), - False, - ) - collisionDeltaFIntegrated = collisionDeltaFPoly.integrate( - (1, 2, 3), integrand - ).coefficients - liovilleDeltaFIntegrated = lioviilleDeltaFPoly.integrate( - (1, 2, 3), integrand - ).coefficients - collCriterion = collisionDeltaFIntegrated / liovilleDeltaFIntegrated - - return deltaFCriterion, collCriterion + dofs = np.array( + [particle.totalDOFs for particle in particles])[:,None,None,None] + integrand = dofs * dmsqdChi * dpzdrz * dppdrp * pp / (4 * np.pi**2 * energy) + + # Computing the pressure contributions of the equilibrium part, the linear + # out-of-equilibrium part and the first-order correction due to nonlinearities. + pressureEq = np.sum(fEqPoly.integrate((1,2,3), integrand).coefficients) + pressureDeltaF = np.sum(deltaFPoly.integrate((1,2,3), integrand).coefficients) + pressureNonlin = np.sum(deltaNonlinPoly.integrate((1,2,3), + integrand).coefficients) + + # Computing the 2 linearisation criteria + criterion1 = abs(pressureDeltaF/pressureEq) + criterion2 = abs(pressureNonlin/(pressureEq+pressureDeltaF)) + + return criterion1, criterion2 def buildLinearEquations( self, @@ -689,4 +695,4 @@ def _dfeq(x: np.ndarray, statistics: int | np.ndarray) -> np.ndarray: x > BoltzmannSolver.MAX_EXPONENT, -0, -1 / (np.exp(x) - 2 * statistics + np.exp(-x)), - ) + ) \ No newline at end of file diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index ffc9bd23..9ea0590b 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -579,6 +579,13 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name ) = self.wallPressure( wallVelocity, newWallParams, boltzmannResultsInput=newBoltzmannResults ) + + # Computing the linearisation criteria + if self.includeOffEq: + criterion1, criterion2 = self.boltzmannSolver.checkLinearization( + boltzmannResults.deltaF) + boltzmannResults.linearizationCriterion1 = criterion1 + boltzmannResults.linearizationCriterion2 = criterion2 # minimum possible error in the wall speed wallVelocityMinError = self.errTol * optimizeResult.root @@ -781,8 +788,6 @@ def wallPressure( deltaF=deltaF, Deltas=offEquilDeltas, truncationError=0.0, - linearizationCriterion1=np.zeros(len(self.particles)), - linearizationCriterion2=np.zeros(len(self.particles)), ) else: boltzmannResults = boltzmannResultsInput diff --git a/src/WallGo/results.py b/src/WallGo/results.py index f406ccf5..4852a091 100644 --- a/src/WallGo/results.py +++ b/src/WallGo/results.py @@ -30,15 +30,14 @@ class BoltzmannResults: # These two criteria are to evaluate the validity of the linearization of the # Boltzmann equation. The arrays contain one element for each out-of-equilibrium # particle. To be valid, at least one criterion must be small for each particle. - linearizationCriterion1: np.ndarray + linearizationCriterion1: float = 0 r"""Ratio of out-of-equilibrium and equilibrium pressures, - :math:`|P[\delta f]| / |P[f_\text{eq}]|`. One element for each - out-of-equilibrium particle.""" + :math:`|P[\delta f]| / |P[f_\text{eq}]|`. Default is 0.""" - linearizationCriterion2: np.ndarray - r"""Ratio of collision and Liouville operators in Boltzmann equation, - :math:`|\mathcal{C}[\delta f]|/ |\mathcal{L}[\delta f]|`. One element for each - out-of-equilibrium particle.""" + linearizationCriterion2: float = 0 + r"""Ratio of the first-order correction due to nonlinearities and total pressure + computed by WallGo, :math:`|P[\delta f_2]| / |P[f_\text{eq}+\delta f]|`. + Default is 0.""" def __mul__(self, number: float) -> "BoltzmannResults": return BoltzmannResults( @@ -172,15 +171,13 @@ class WallGoResults: temperatureProfile: np.ndarray r"""Temperarture profile as a function of position, :math:`T(\xi)`.""" - linearizationCriterion1: np.ndarray + linearizationCriterion1: float r"""Ratio of out-of-equilibrium and equilibrium pressures, - :math:`|P[\delta f]| / |P[f_\text{eq}]|`. One element for each - out-of-equilibrium particle.""" + :math:`|P[\delta f]| / |P[f_\text{eq}]|`.""" - linearizationCriterion2: np.ndarray - r"""Ratio of collision and Liouville operators in Boltzmann equation, - :math:`|\mathcal{C}[\delta f]|/ |\mathcal{L}[\delta f]|`. One element for each - out-of-equilibrium particle.""" + linearizationCriterion2: float + r"""Ratio of the first-order correction due to nonlinearities and total pressure + computed by WallGo, :math:`|P[\delta f_2]| / |P[f_\text{eq}+\delta f]|`.""" deltaF: np.ndarray r"""Deviation of probability density function from equilibrium, @@ -297,4 +294,4 @@ def setSuccessState( ) self.success = success self.message = message - self.solutionType = solutionType + self.solutionType = solutionType \ No newline at end of file From a654a365cd0f352d6dc4271261a4870c51fd7354 Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Mon, 28 Apr 2025 18:32:21 +0100 Subject: [PATCH 02/24] Merge pull request #7 from Wall-Go/aliasing Spectral truncation --- src/WallGo/__init__.py | 2 +- src/WallGo/boltzmann.py | 118 +++++++++++++++++++++++++++++++++++++++- src/WallGo/config.py | 18 +++--- src/WallGo/manager.py | 6 +- tests/test_Boltzmann.py | 45 +++++++++++++++ 5 files changed, 178 insertions(+), 11 deletions(-) diff --git a/src/WallGo/__init__.py b/src/WallGo/__init__.py index dba74acb..c4554d17 100644 --- a/src/WallGo/__init__.py +++ b/src/WallGo/__init__.py @@ -5,7 +5,7 @@ import importlib # package level modules -from .boltzmann import BoltzmannSolver +from .boltzmann import BoltzmannSolver, ETruncationOption from .config import Config from .collisionArray import CollisionArray from .containers import PhaseInfo, BoltzmannBackground, BoltzmannDeltas, WallParams diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index 16b57d5a..3ef2fbc1 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -6,6 +6,7 @@ import typing from copy import deepcopy import logging +from enum import Enum, auto import numpy as np import findiff # finite difference methods from .containers import BoltzmannBackground, BoltzmannDeltas @@ -20,6 +21,19 @@ import importlib +class ETruncationOption(Enum): + """Enums for what to do with truncating the spectral expansion.""" + + NONE = auto() + """Do not truncate early, use all coefficients.""" + + AUTO = auto() + """Truncate early if it seems the UV is not converging.""" + + THIRD = auto() + """Drop the last third of the coefficients.""" + + class BoltzmannSolver: """ Class for solving Boltzmann equations for small deviations from equilibrium. @@ -33,6 +47,7 @@ class BoltzmannSolver: offEqParticles: list[Particle] background: BoltzmannBackground collisionArray: CollisionArray + truncationOption: ETruncationOption def __init__( self, @@ -41,6 +56,7 @@ def __init__( basisN: str = "Chebyshev", derivatives: str = "Spectral", collisionMultiplier: float = 1.0, + truncationOption: ETruncationOption = ETruncationOption.AUTO, ): """ Initialisation of BoltzmannSolver @@ -62,6 +78,10 @@ def __init__( collisionMultiplier : float, optional Factor by which the collision term is multiplied. Can be used for testing. Default is 1.0. + truncationOption : ETruncationOption, optional + Option for truncating the spectral expansion. Default is + ETruncationOption.NONE, which means no truncation. Other options + are ETruncationOption.AUTO and ETruncationOption.THIRD. Returns ------- @@ -85,6 +105,7 @@ def __init__( self.basisN = basisN self.collisionMultiplier = collisionMultiplier + self.truncationOption = truncationOption # These are set, and can be updated, by our member functions # TODO: are these None types the best way to go? @@ -142,8 +163,12 @@ def getDeltas(self, deltaF = self.solveBoltzmannEquations() # getting (optimistic) estimate of truncation error + # must be before checkSpectralConvergence truncationError = self.estimateTruncationError(deltaF) + # checking spectral convergence + deltaF = self.checkSpectralConvergence(deltaF) + particles = self.offEqParticles # constructing Polynomial class from deltaF array @@ -310,6 +335,98 @@ def estimateTruncationError(self, deltaF: np.ndarray) -> float: np.max(truncationErrorPp / deltaFMeanAbs), ) + def checkSpectralConvergence(self, deltaF: np.ndarray) -> np.ndarray: + """ + Check for spectral convergence. Tests if last points + in spectral sum are small compared to the 2/3rd points. + + Parameters + ---------- + deltaF : array_like + The solution for which to estimate the truncation error, + a rank 3 array, with shape :py:data:`(len(z), len(pz), len(pp))`. + + Returns + ------- + deltaFTruncated : np.ndarray + Potentially truncated version of input :py:data:`deltaF`. + """ + if self.grid.M < 4 or self.grid.N < 4: + logging.warn(f"Cannot check spectral convergence with N, M < 4.") + return deltaF + + # constructing Polynomial + basisTypes = ("Array", self.basisM, self.basisN, self.basisN) + basisNames = ("Array", "z", "pz", "pp") + deltaFPoly = Polynomial(deltaF, self.grid, basisTypes, basisNames, False) + + # changing to Chebyshev basis + deltaFPoly.changeBasis(("Array", "Chebyshev", "Chebyshev", "Chebyshev")) + + # looking at convergence of spectral expansion + spectralCoeffsChi = np.sum( + np.abs(deltaFPoly.coefficients), + axis=(0, 2, 3), + ) + spectralCoeffsPz = np.sum( + np.abs(deltaFPoly.coefficients), + axis=(0, 1, 3), + ) + spectralCoeffsPp = np.sum( + np.abs(deltaFPoly.coefficients), + axis=(0, 1, 2), + ) + + cutSpatial = -(self.grid.M - 1) // 3 + cutMomentum = -(self.grid.N - 1) // 3 + # fit slope to the log of the last 1/3rd of the coefficients + toFitChi = spectralCoeffsChi[cutSpatial:] + toFitPz = spectralCoeffsPz[cutMomentum:] + toFitPp = spectralCoeffsPp[cutMomentum:] + slopeChi = np.polyfit( + np.arange(len(toFitChi)), np.log(toFitChi), 1 + )[0] + slopePz = np.polyfit( + np.arange(len(toFitPz)), np.log(toFitPz), 1 + )[0] + slopePp = np.polyfit( + np.arange(len(toFitPp)), np.log(toFitPp), 1 + )[0] + logging.debug("Fit to last 1/3 of spectral coefficients gives the following powers:") + logging.debug(f"Chi: {slopeChi}, Pz: {slopePz}, Pp: {slopePp}") + + # Deciding what to do based on truncationOption + if self.truncationOption == ETruncationOption.AUTO: + # if the slope is positive, we will truncate + if slopeChi > 0: + logging.debug("Truncating last 1/3 of spectral coefficients in chi direction") + deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 + elif slopePz > 0: + logging.debug("Truncating last 1/3 of spectral coefficients in pz direction") + deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 + elif slopePp > 0: + logging.debug("Truncating last 1/3 of spectral coefficients in pp direction") + deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 + else: + logging.debug("Spectral expansion converging, so not truncating") + elif self.truncationOption == ETruncationOption.THIRD: + logging.debug("Truncating last 1/3 of spectral coefficients in all directions") + deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 + deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 + deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 + if slopeChi < 0 and slopePz < 0 and slopePp < 0: + logging.info("Spectral expansions converging but truncated, consider changing truncation option") + else: + logging.debug("Not truncating") + if slopeChi > 0 or slopePz > 0 or slopePp > 0: + logging.info("Spectral expansions not converging, consider changing truncation option") + return deltaF + + # changing back to original basis + deltaFPoly.changeBasis(basisTypes) + + return deltaFPoly.coefficients + def checkLinearization( self, deltaF: typing.Optional[np.ndarray] = None ) -> tuple[float, float]: @@ -351,7 +468,6 @@ def checkLinearization( deltaFSqPoly = deltaFPoly*deltaFPoly deltaFSqPoly.changeBasis(("Array", self.basisM, self.basisN, self.basisN)) - operator, _, _, collision = self.buildLinearEquations() source = np.sum( collision*deltaFSqPoly.coefficients[None,None,None,None,...], diff --git a/src/WallGo/config.py b/src/WallGo/config.py index 9e5f8c1a..b51a172f 100644 --- a/src/WallGo/config.py +++ b/src/WallGo/config.py @@ -138,6 +138,9 @@ class ConfigBoltzmannSolver: WARNING: THIS CHANGES THE COLLISION TERMS WRT TO THEIR PHYSICAL VALUE. """ + truncationOption: str = 'AUTO' + """ Truncation option for spectral expansions. Can be 'NONE' for no truncation, 'AUTO' to automatically detect if the spectral expansion is converging and truncate if not, or 'THIRD' which always truncates the last third. """ + @dataclass class Config: """ @@ -287,12 +290,13 @@ def loadConfigFromFile(self, filePath: str) -> None: if 'BoltzmannSolver' in parser.sections(): keys = parser['BoltzmannSolver'].keys() if 'collisionMultiplier' in keys: - self.configBoltzmannSolver.collisionMultiplier = parser.getfloat( - "BoltzmannSolver", - "collisionMultiplier") + self.configBoltzmannSolver.collisionMultiplier = parser.getfloat("BoltzmannSolver", "collisionMultiplier") if 'basisM' in keys: - self.configBoltzmannSolver.basisM = parser.get("BoltzmannSolver", - "basisM") + self.configBoltzmannSolver.basisM = parser.get( + "BoltzmannSolver", "basisM") if 'basisN' in keys: - self.configBoltzmannSolver.basisN = parser.get("BoltzmannSolver", - "basisN") + self.configBoltzmannSolver.basisN = parser.get( + "BoltzmannSolver", "basisN") + if 'truncationOption' in keys: + self.configBoltzmannSolver.truncationOption = parser.get( + "BoltzmannSolver", "truncationOption") diff --git a/src/WallGo/manager.py b/src/WallGo/manager.py index dc27d8de..15cd7479 100644 --- a/src/WallGo/manager.py +++ b/src/WallGo/manager.py @@ -10,7 +10,7 @@ # WallGo imports import WallGo -from .boltzmann import BoltzmannSolver +from .boltzmann import BoltzmannSolver, ETruncationOption from .containers import PhaseInfo from .equationOfMotion import EOM from .exceptions import WallGoError, WallGoPhaseValidationError @@ -529,13 +529,15 @@ def setupWallSolver(self, wallSolverSettings: WallSolverSettings) -> WallSolver: # Factor that multiplies the collision term in the Boltzmann equation. collisionMultiplier = self.config.configBoltzmannSolver.collisionMultiplier + truncationOption = ETruncationOption[self.config.configBoltzmannSolver.truncationOption] # Hardcode basis types here: Cardinal for z, Chebyshev for pz, pp boltzmannSolver = BoltzmannSolver( grid, basisM="Cardinal", basisN="Chebyshev", collisionMultiplier=collisionMultiplier, - ) + truncationOption=truncationOption, + ) boltzmannSolver.updateParticleList(self.model.outOfEquilibriumParticles) diff --git a/tests/test_Boltzmann.py b/tests/test_Boltzmann.py index a4059196..5a23577a 100644 --- a/tests/test_Boltzmann.py +++ b/tests/test_Boltzmann.py @@ -38,6 +38,7 @@ def test_Delta00( grid = WallGo.grid.Grid(spatialGridSize, momentumGridSize, 1, 100) collisionPath = dir_path / "TestData/N19" boltzmann = WallGo.BoltzmannSolver(grid, "Cardinal", "Cardinal", "Spectral") + boltzmann.truncationOption = WallGo.ETruncationOption.NONE boltzmann.updateParticleList([particle]) boltzmann.setBackground(bg) @@ -122,3 +123,47 @@ def test_solution( # asserting solution works assert ratio == pytest.approx(0, abs=1e-14) + + +@pytest.mark.parametrize("spatialGridSize, momentumGridSize, slope", [(5, 5, -0.1), (5, 5, -0.1), (7, 7, 0.1)]) +def test_checkSpectralConvergence( + boltzmannTestBackground: WallGo.BoltzmannBackground, + particle: WallGo.Particle, + spatialGridSize: int, + momentumGridSize: int, + slope: float, +) -> None: + """ + Tests that the Boltzmann equation is satisfied by the solution + """ + # setting up objects + grid = WallGo.grid.Grid(spatialGridSize, momentumGridSize, 1, 1) + boltzmann = WallGo.BoltzmannSolver(grid) + boltzmann.basisM = "Chebyshev" + boltzmann.basisN = "Chebyshev" + + # solving Boltzmann equations + deltaFShape = ( + 1, + spatialGridSize - 1, + momentumGridSize - 1, + momentumGridSize - 1, + ) + deltaF = np.zeros(deltaFShape) + for z in range(spatialGridSize - 1): + for pz in range(momentumGridSize - 1): + for pp in range(momentumGridSize - 1): + deltaF[0, z, pz, pp] = np.exp(slope*z -1e-2*pz - 1e-2*pp) + + + # checking spectral convergence + deltaFTruncated = boltzmann.checkSpectralConvergence(deltaF) + + nTrucated = -deltaFTruncated.shape[1] // 3 + expectTruncated = deltaFTruncated[:, nTrucated // 3, :, :] + + # asserting truncation + if slope > 0: + assert np.allclose(expectTruncated, np.zeros_like(expectTruncated)) + else: + assert not np.allclose(expectTruncated, np.zeros_like(expectTruncated)) From ebe65321826ad71dbc97ccf90a7a794105c03c0c Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Mon, 12 May 2025 17:36:21 +0100 Subject: [PATCH 03/24] Merge pull request #9 from Wall-Go/includeAliasingError Error estimate moved after auto truncation --- .../singletStandardModelZ2Config.ini | 3 + src/WallGo/boltzmann.py | 251 ++++++++++++------ tests/test_Boltzmann.py | 12 +- 3 files changed, 175 insertions(+), 91 deletions(-) diff --git a/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini b/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini index 8a1bd1c4..5c529cc4 100644 --- a/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini +++ b/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini @@ -96,3 +96,6 @@ basisM = Cardinal # The momentum polynomial basis type, either Cardinal or Chebyshev. basisN = Chebyshev + +# Whether or not to truncate the spectral expansion +truncationOption = AUTO diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index 3ef2fbc1..f1899052 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -103,7 +103,7 @@ def __init__( self.basisM = basisM # Momentum polynomial type self.basisN = basisN - + self.collisionMultiplier = collisionMultiplier self.truncationOption = truncationOption @@ -138,9 +138,10 @@ def updateParticleList(self, offEqParticles: list[Particle]) -> None: self.offEqParticles = offEqParticles - def getDeltas(self, - deltaF: typing.Optional[np.ndarray] = None, - ) -> BoltzmannResults: + def getDeltas( + self, + deltaF: typing.Optional[np.ndarray] = None, + ) -> BoltzmannResults: """ Computes Deltas necessary for solving the Higgs equation of motion. @@ -162,12 +163,13 @@ def getDeltas(self, if deltaF is None: deltaF = self.solveBoltzmannEquations() - # getting (optimistic) estimate of truncation error - # must be before checkSpectralConvergence - truncationError = self.estimateTruncationError(deltaF) - # checking spectral convergence - deltaF = self.checkSpectralConvergence(deltaF) + deltaF, shapeTruncated = self.checkSpectralConvergence(deltaF) + + # getting (optimistic) estimate of truncation error + truncationError = self.estimateTruncationError( + deltaF, shapeTruncated + ) particles = self.offEqParticles @@ -240,15 +242,15 @@ def solveBoltzmannEquations(self) -> np.ndarray: where :math:`\mathcal{L}` is the Lioville operator, :math:`\mathcal{C}` is the collision operator, and :math:`\mathcal{S}` is the source. - + As regards the indicies, - + - :math:`\alpha, \beta, \gamma` denote points on the coordinate lattice :math:`\{\xi^{(\alpha)},p_{z}^{(\beta)},p_{\Vert}^{(\gamma)}\}`, - :math:`i, j, k` denote elements of the basis of spectral functions :math:`\{\bar{T}_i, \bar{T}_j, \tilde{T}_k\}`, - :math:`a, b` denote particle species. - + For more details see the WallGo paper. Parameters @@ -284,7 +286,7 @@ def solveBoltzmannEquations(self) -> np.ndarray: return deltaF - def estimateTruncationError(self, deltaF: np.ndarray) -> float: + def estimateTruncationError(self, deltaF: np.ndarray, shapeTruncated: tuple[int, ...]) -> float: r""" Quick estimate of the polynomial truncation error using John Boyd's Rule-of-thumb-2: the last coefficient of a Chebyshev @@ -309,33 +311,39 @@ def estimateTruncationError(self, deltaF: np.ndarray) -> float: # sum(|deltaF|) as the norm deltaFPoly.changeBasis(("Array", "Chebyshev", "Chebyshev", "Chebyshev")) - deltaFMeanAbs = np.sum( - np.abs(deltaFPoly.coefficients), + deltaFTuncated = deltaFPoly.coefficients[ + :shapeTruncated[0], + :shapeTruncated[1], + :shapeTruncated[2], + :shapeTruncated[3], + ] + deltaFSumAbs = np.sum( + np.abs(deltaFTuncated), axis=(1, 2, 3), ) # estimating truncation errors in each direction truncationErrorChi = np.sum( - np.abs(deltaFPoly.coefficients[:, -1, :, :]), + np.abs(deltaFTuncated[:, -1, :, :]), axis=(1, 2), - ) + ) / deltaFSumAbs truncationErrorPz = np.sum( - np.abs(deltaFPoly.coefficients[:, :, -1, :]), + np.abs(deltaFTuncated[:, :, -1, :]), axis=(1, 2), - ) + ) / deltaFSumAbs truncationErrorPp = np.sum( - np.abs(deltaFPoly.coefficients[:, :, :, -1]), + np.abs(deltaFTuncated[:, :, :, -1]), axis=(1, 2), - ) + ) / deltaFSumAbs # estimating the total truncation error as the maximum of these three return max( # type: ignore[no-any-return] - np.max(truncationErrorChi / deltaFMeanAbs), - np.max(truncationErrorPz / deltaFMeanAbs), - np.max(truncationErrorPp / deltaFMeanAbs), + np.max(truncationErrorChi), + np.max(truncationErrorPz), + np.max(truncationErrorPp), ) - def checkSpectralConvergence(self, deltaF: np.ndarray) -> np.ndarray: + def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tuple[int, ...]]: """ Check for spectral convergence. Tests if last points in spectral sum are small compared to the 2/3rd points. @@ -349,16 +357,23 @@ def checkSpectralConvergence(self, deltaF: np.ndarray) -> np.ndarray: Returns ------- deltaFTruncated : np.ndarray - Potentially truncated version of input :py:data:`deltaF`. + Potentially truncated version of input :py:data:`deltaF`, padded with zeros if truncated, so same shape as input. + shapeTruncated : tuple + Shape of truncated array. """ - if self.grid.M < 4 or self.grid.N < 4: - logging.warn(f"Cannot check spectral convergence with N, M < 4.") - return deltaF + if self.grid.M < 7 or self.grid.N < 7: + logging.warning(f"Cannot check spectral convergence with N, M < 7.") + return deltaF, deltaF.shape + elif self.grid.M < 13 or self.grid.N < 13: + strict = False + else: + strict = True # constructing Polynomial basisTypes = ("Array", self.basisM, self.basisN, self.basisN) basisNames = ("Array", "z", "pz", "pp") deltaFPoly = Polynomial(deltaF, self.grid, basisTypes, basisNames, False) + truncatedShape = list(deltaF.shape) # changing to Chebyshev basis deltaFPoly.changeBasis(("Array", "Chebyshev", "Chebyshev", "Chebyshev")) @@ -377,55 +392,115 @@ def checkSpectralConvergence(self, deltaF: np.ndarray) -> np.ndarray: axis=(0, 1, 2), ) - cutSpatial = -(self.grid.M - 1) // 3 - cutMomentum = -(self.grid.N - 1) // 3 + # how much to cut, if truncating + cutSpatial = -((self.grid.M - 1) // 3) + cutMomentum = -((self.grid.N - 1) // 3) + # fit slope to the log of the last 1/3rd of the coefficients - toFitChi = spectralCoeffsChi[cutSpatial:] - toFitPz = spectralCoeffsPz[cutMomentum:] - toFitPp = spectralCoeffsPp[cutMomentum:] - slopeChi = np.polyfit( - np.arange(len(toFitChi)), np.log(toFitChi), 1 - )[0] - slopePz = np.polyfit( - np.arange(len(toFitPz)), np.log(toFitPz), 1 - )[0] - slopePp = np.polyfit( - np.arange(len(toFitPp)), np.log(toFitPp), 1 - )[0] - logging.debug("Fit to last 1/3 of spectral coefficients gives the following powers:") - logging.debug(f"Chi: {slopeChi}, Pz: {slopePz}, Pp: {slopePp}") + if strict: + # enough points to fit slopes with errors + fitChi = np.polyfit( + np.arange(abs(cutSpatial)), + np.log(spectralCoeffsChi[cutSpatial:]), + 1, + cov=True, + ) + fitPz = np.polyfit( + np.arange(abs(cutMomentum)), + np.log(spectralCoeffsPz[cutMomentum:]), + 1, + cov=True, + ) + fitPp = np.polyfit( + np.arange(abs(cutMomentum)), + np.log(spectralCoeffsPp[cutMomentum:]), + 1, + cov=True, + ) + chiConverging = fitChi[0][0] < - np.sqrt(fitChi[1][0, 0]) + pzConverging = fitPz[0][0] < - np.sqrt(fitPz[1][0, 0]) + ppConverging = fitPp[0][0] < - np.sqrt(fitPp[1][0, 0]) + logging.debug( + f"Spectral convergence: n_chi^({fitChi[0][0]:.2g}+/-{np.sqrt(fitChi[1][0, 0]):.2g}), n_pz^({fitPz[0][0]:.2g}+/-{np.sqrt(fitPz[1][0, 0]):.2g}), n_pp^({fitPp[0][0]:.2g}+/-{np.sqrt(fitPp[1][0, 0]):.2g})" + ) + else: + # not enough points to get sensible errors + fitChi = np.polyfit( + np.arange(abs(cutSpatial)), + np.log(spectralCoeffsChi[cutSpatial:]), + 1, + cov=False, + ) + fitPz = np.polyfit( + np.arange(abs(cutMomentum)), + np.log(spectralCoeffsPz[cutMomentum:]), + 1, + cov=False, + ) + fitPp = np.polyfit( + np.arange(abs(cutMomentum)), + np.log(spectralCoeffsPp[cutMomentum:]), + 1, + cov=False, + ) + chiConverging = fitChi[0] < 0 + pzConverging = fitPz[0] < 0 + ppConverging = fitPp[0] < 0 + logging.debug( + f"Spectral convergence: n_chi^({fitChi[0]:.2g}), n_pz^({fitPz[0]:.2g}), n_pp^({fitPp[0]:.2g})" + ) + # Deciding what to do based on truncationOption if self.truncationOption == ETruncationOption.AUTO: - # if the slope is positive, we will truncate - if slopeChi > 0: - logging.debug("Truncating last 1/3 of spectral coefficients in chi direction") + # if the slope is not definitely negative, we will truncate + if not chiConverging: + # logging.debug("Truncating last 1/3 of spectral coefficients in chi direction") deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 - elif slopePz > 0: - logging.debug("Truncating last 1/3 of spectral coefficients in pz direction") + truncatedShape[1] = deltaF.shape[1] + cutSpatial + if not pzConverging: + # logging.debug("Truncating last 1/3 of spectral coefficients in pz direction") deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 - elif slopePp > 0: - logging.debug("Truncating last 1/3 of spectral coefficients in pp direction") + truncatedShape[2] = deltaF.shape[2] + cutMomentum + if not ppConverging: + # logging.debug("Truncating last 1/3 of spectral coefficients in pp direction") deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 - else: - logging.debug("Spectral expansion converging, so not truncating") + truncatedShape[3] = deltaF.shape[3] + cutMomentum + # if truncatedShape == list(deltaF.shape): + # logging.debug("Spectral expansion converging, so not truncating") elif self.truncationOption == ETruncationOption.THIRD: - logging.debug("Truncating last 1/3 of spectral coefficients in all directions") + # logging.debug("Truncating last 1/3 of spectral coefficients in all directions") deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 - if slopeChi < 0 and slopePz < 0 and slopePp < 0: - logging.info("Spectral expansions converging but truncated, consider changing truncation option") + truncatedShape[1:] = [ + deltaF.shape[1] + cutSpatial, + deltaF.shape[2] + cutMomentum, + deltaF.shape[3] + cutMomentum, + ] + if chiConverging and pzConverging and ppConverging: + logging.info( + "Spectral expansions converging but truncated, consider changing truncation option" + ) else: - logging.debug("Not truncating") - if slopeChi > 0 or slopePz > 0 or slopePp > 0: - logging.info("Spectral expansions not converging, consider changing truncation option") - return deltaF + # logging.debug("Not truncating") + if not chiConverging or not pzConverging or not ppConverging: + logging.info( + "Spectral expansions not converging, consider changing truncation option, or changing grid parameters" + ) + return deltaF, deltaF.shape # changing back to original basis deltaFPoly.changeBasis(basisTypes) - return deltaFPoly.coefficients + return deltaFPoly.coefficients, tuple(truncatedShape) + + @staticmethod + def _smoothTruncation(length: int, cut: int, sharp: float = 3) -> np.ndarray: + """ + Internal function to smooth the truncation of the spectral expansion. """ + x = np.arange(length) + return 1 / (1 + np.exp(sharp * (x - cut))) def checkLinearization( self, deltaF: typing.Optional[np.ndarray] = None @@ -463,19 +538,21 @@ def checkLinearization( False, ) deltaFPoly.changeBasis(("Array", "Cardinal", "Cardinal", "Cardinal")) - + # Computing \delta f^2 - deltaFSqPoly = deltaFPoly*deltaFPoly + deltaFSqPoly = deltaFPoly * deltaFPoly deltaFSqPoly.changeBasis(("Array", self.basisM, self.basisN, self.basisN)) - + operator, _, _, collision = self.buildLinearEquations() source = np.sum( - collision*deltaFSqPoly.coefficients[None,None,None,None,...], - axis=(4,5,6,7)) + collision * deltaFSqPoly.coefficients[None, None, None, None, ...], + axis=(4, 5, 6, 7), + ) # Computing the correction from nonlinear terms - deltaNonlin = np.linalg.solve(operator, - np.reshape(source, source.size, order="C")) + deltaNonlin = np.linalg.solve( + operator, np.reshape(source, source.size, order="C") + ) deltaNonlinShape = ( len(self.offEqParticles), self.grid.M - 1, @@ -498,15 +575,15 @@ def checkLinearization( for particle in particles ] ) - + msqPoly = Polynomial( msqFull, self.grid, - ('Array', 'Cardinal'), - 'z', + ("Array", "Cardinal"), + "z", True, - ) - dmsqdChi = msqPoly.derivative(axis=1).coefficients[:,1:-1,None,None] + ) + dmsqdChi = msqPoly.derivative(axis=1).coefficients[:, 1:-1, None, None] # adding new axes, to make everything rank 3 like deltaF (z, pz, pp) # for fast multiplication of arrays, using numpy's broadcasting rules @@ -534,21 +611,23 @@ def checkLinearization( dpzdrz = dpzdrz[None, None, :, None] dppdrp = dppdrp[None, None, None, :] - dofs = np.array( - [particle.totalDOFs for particle in particles])[:,None,None,None] + dofs = np.array([particle.totalDOFs for particle in particles])[ + :, None, None, None + ] integrand = dofs * dmsqdChi * dpzdrz * dppdrp * pp / (4 * np.pi**2 * energy) - + # Computing the pressure contributions of the equilibrium part, the linear # out-of-equilibrium part and the first-order correction due to nonlinearities. - pressureEq = np.sum(fEqPoly.integrate((1,2,3), integrand).coefficients) - pressureDeltaF = np.sum(deltaFPoly.integrate((1,2,3), integrand).coefficients) - pressureNonlin = np.sum(deltaNonlinPoly.integrate((1,2,3), - integrand).coefficients) - + pressureEq = np.sum(fEqPoly.integrate((1, 2, 3), integrand).coefficients) + pressureDeltaF = np.sum(deltaFPoly.integrate((1, 2, 3), integrand).coefficients) + pressureNonlin = np.sum( + deltaNonlinPoly.integrate((1, 2, 3), integrand).coefficients + ) + # Computing the 2 linearisation criteria - criterion1 = abs(pressureDeltaF/pressureEq) - criterion2 = abs(pressureNonlin/(pressureEq+pressureDeltaF)) - + criterion1 = abs(pressureDeltaF / pressureEq) + criterion2 = abs(pressureNonlin / (pressureEq + pressureDeltaF)) + return criterion1, criterion2 def buildLinearEquations( @@ -811,4 +890,4 @@ def _dfeq(x: np.ndarray, statistics: int | np.ndarray) -> np.ndarray: x > BoltzmannSolver.MAX_EXPONENT, -0, -1 / (np.exp(x) - 2 * statistics + np.exp(-x)), - ) \ No newline at end of file + ) diff --git a/tests/test_Boltzmann.py b/tests/test_Boltzmann.py index 5a23577a..f761a3b4 100644 --- a/tests/test_Boltzmann.py +++ b/tests/test_Boltzmann.py @@ -125,7 +125,7 @@ def test_solution( assert ratio == pytest.approx(0, abs=1e-14) -@pytest.mark.parametrize("spatialGridSize, momentumGridSize, slope", [(5, 5, -0.1), (5, 5, -0.1), (7, 7, 0.1)]) +@pytest.mark.parametrize("spatialGridSize, momentumGridSize, slope", [(7, 9, -0.1), (9, 9, -0.1), (11, 9, 0.1)]) def test_checkSpectralConvergence( boltzmannTestBackground: WallGo.BoltzmannBackground, particle: WallGo.Particle, @@ -157,13 +157,15 @@ def test_checkSpectralConvergence( # checking spectral convergence - deltaFTruncated = boltzmann.checkSpectralConvergence(deltaF) + deltaFTruncated, truncatedShape = boltzmann.checkSpectralConvergence(deltaF) - nTrucated = -deltaFTruncated.shape[1] // 3 - expectTruncated = deltaFTruncated[:, nTrucated // 3, :, :] + nTruncated = (spatialGridSize - 1) // 3 + expectTruncated = deltaFTruncated[:, -nTruncated:, :, :] # asserting truncation if slope > 0: - assert np.allclose(expectTruncated, np.zeros_like(expectTruncated)) + assert truncatedShape == (1, spatialGridSize - 1 - nTruncated, momentumGridSize - 1, momentumGridSize - 1) + assert np.allclose(expectTruncated, np.zeros_like(expectTruncated), atol=1e-2) else: + assert truncatedShape == (1, spatialGridSize - 1, momentumGridSize - 1, momentumGridSize - 1) assert not np.allclose(expectTruncated, np.zeros_like(expectTruncated)) From ff611e854ff12fd675bb80f38faf990d4014d1d8 Mon Sep 17 00:00:00 2001 From: benoitlaurent96 <132939700+benoitlaurent96@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:44:08 -0400 Subject: [PATCH 04/24] Merge pull request #15 from Wall-Go/tanhError Tanh error --- src/WallGo/equationOfMotion.py | 82 +++++++++ src/WallGo/results.py | 16 ++ tests/test_EOM.py | 323 +++++++++++++++++++++++++++++++++ 3 files changed, 421 insertions(+) create mode 100644 tests/test_EOM.py diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 9ea0590b..ec5b0536 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -579,6 +579,13 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name ) = self.wallPressure( wallVelocity, newWallParams, boltzmannResultsInput=newBoltzmannResults ) + + eomResidual = self.estimateTanhError( + wallParams, + boltzmannResults, + boltzmannBackground, + hydroResults + ) # Computing the linearisation criteria if self.includeOffEq: @@ -633,6 +640,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name results.setBoltzmannBackground(boltzmannBackground) results.setBoltzmannResults(boltzmannResults) results.setFiniteDifferenceBoltzmannResults(finiteDifferenceBoltzmannResults) + results.eomResidual = eomResidual # Set the message if not self.successTemperatureProfile: @@ -1348,6 +1356,80 @@ def action( ) return float(U + K) + + def estimateTanhError( + self, + wallParams: WallParams, + boltzmannResults: BoltzmannResults, + boltzmannBackground: BoltzmannBackground, + hydroResults: HydroResults, + ) -> np.ndarray: + """ + Estimates the EOM error due to the tanh ansatz. It is estimated by the integral + + .. math:: \sqrt{\Delta[\mathrm{EOM}^2]/|\mathrm{EOM}^2|}, + + with + + .. math:: \Delta[\mathrm{EOM}^2]=\int\! dz\, (-\partial_z^2 \phi+ \partial V_{\mathrm{eq}}/ \partial \phi+ \partial V_{\mathrm{out}}/ \partial \phi )^2 + + and + + .. math:: |\mathrm{EOM}^2|=\int\! dz\, [(\partial_z^2 \phi)^2+ (\partial V_{\mathrm{eq}}/ \partial \phi)^2+ (\partial V_{\mathrm{out}}/ \partial \phi)^2]. + + """ + Tminus = hydroResults.temperatureMinus + Tplus = hydroResults.temperaturePlus + + # Positions of the phases + TminusEval = max( + min(Tminus, self.thermo.freeEnergyLow.interpolationRangeMax()), + self.thermo.freeEnergyLow.interpolationRangeMin(), + ) + TplusEval = max( + min(Tplus, self.thermo.freeEnergyHigh.interpolationRangeMax()), + self.thermo.freeEnergyHigh.interpolationRangeMin(), + ) + vevLowT = self.thermo.freeEnergyLow(TminusEval).fieldsAtMinimum + vevHighT = self.thermo.freeEnergyHigh(TplusEval).fieldsAtMinimum + + temperatureProfile = boltzmannBackground.temperatureProfile[1:-1] + + z = self.grid.xiValues + fields = self.wallProfile(z, vevLowT, vevHighT, wallParams)[0] + d2FieldsDz2 = -( + (vevHighT-vevLowT) + * np.tanh(z[:,None]/wallParams.widths[None,:] + wallParams.offsets) + / np.cosh(z[:,None]/wallParams.widths[None,:] + wallParams.offsets)**2 + / wallParams.widths**2 + ) + + dVdPhi = self.thermo.effectivePotential.derivField(fields, temperatureProfile) + + # Out-of-equilibrium term of the EOM + dVout = ( + np.sum( + [ + particle.totalDOFs + * particle.msqDerivative(fields) + * boltzmannResults.Deltas.Delta00.coefficients[i, :, None] + for i, particle in enumerate(self.particles) + ], + axis=0, + ) + / 2 + ) + + eomSq = (-d2FieldsDz2 + dVdPhi + dVout)**2 + eomSqScale = d2FieldsDz2**2 + dVdPhi**2 + dVout**2 + + eomSqPoly = Polynomial(eomSq, self.grid, basis=("Cardinal", "Array")) + eomSqScalePoly = Polynomial(eomSqScale, self.grid, basis=("Cardinal", "Array")) + dzdchi, _, _ = self.grid.getCompactificationDerivatives() + eomSqResidual = eomSqPoly.integrate(axis=0, weight=dzdchi[:,None]) + eomSqScaleIntegrated = eomSqScalePoly.integrate(axis=0, weight=dzdchi[:,None]) + + return eomSqResidual.coefficients/eomSqScaleIntegrated.coefficients def wallProfile( self, diff --git a/src/WallGo/results.py b/src/WallGo/results.py index 4852a091..ef8c58da 100644 --- a/src/WallGo/results.py +++ b/src/WallGo/results.py @@ -174,6 +174,22 @@ class WallGoResults: linearizationCriterion1: float r"""Ratio of out-of-equilibrium and equilibrium pressures, :math:`|P[\delta f]| / |P[f_\text{eq}]|`.""" + + eomResidual: np.ndarray + """ + Residual of the EOM due to the tanh ansatz. There is one element for each scalar + field. It is estimated by the integral + + .. math:: \sqrt{\Delta[\mathrm{EOM}^2]/|\mathrm{EOM}^2|} + + with + + .. math:: \Delta[\mathrm{EOM}^2]=\int\! dz\, (-\partial_z^2 \phi+ \partial V_{\mathrm{eq}}/ \partial \phi+ \partial V_{\mathrm{out}}/ \partial \phi )^2 + + and + + .. math:: |\mathrm{EOM}^2|=\int\! dz\, [(\partial_z^2 \phi)^2+ (\partial V_{\mathrm{eq}}/ \partial \phi)^2+ (\partial V_{\mathrm{out}}/ \partial \phi)^2]. + """ linearizationCriterion2: float r"""Ratio of the first-order correction due to nonlinearities and total pressure diff --git a/tests/test_EOM.py b/tests/test_EOM.py new file mode 100644 index 00000000..2a8459da --- /dev/null +++ b/tests/test_EOM.py @@ -0,0 +1,323 @@ +import pytest +from dataclasses import dataclass +import numpy as np +from scipy.integrate import odeint +import WallGo + +class QuarticZ2(WallGo.GenericModel): + r""" + Z2 symmetric quartic potential. + + The potential is given by: + V = 1/2 muSq |phi|^2 + 1/4 lam |phi|^4 + + This class inherits from the GenericModel class and implements the necessary + methods for the WallGo package. + """ + + def __init__(self, modelParameters: dict[str, float]): + """ + Initialize the QuarticZ2 model. + """ + + self.modelParameters = modelParameters + + # Initialize internal effective potential + self.effectivePotential = EffectivePotentialQuarticZ2(self) + + # Create a list of particles relevant for the Boltzmann equations + self.defineParticles() + + # ~ GenericModel interface + @property + def fieldCount(self) -> int: + """How many classical background fields""" + return 1 + + def getEffectivePotential(self) -> "EffectivePotentialQuarticZ2": + return self.effectivePotential + + # ~ + + def defineParticles(self) -> None: + """ + Define the particles for the model. + Note that the particle list only needs to contain the + particles that are relevant for the Boltzmann equations. + The particles relevant to the effective potential are + included independently. + + Parameters + ---------- + None + + Returns + ---------- + None + """ + self.clearParticles() + + # === Top quark === + # The msqVacuum function of an out-of-equilibrium particle must take + # a Fields object and return an array of length equal to the number of + # points in fields. + def topMsqVacuum(fields: WallGo.Fields) -> WallGo.Fields: + return 0.5 * fields.getField(0) ** 2 + + # The msqDerivative function of an out-of-equilibrium particle must take + # a Fields object and return an array with the same shape as fields. + def topMsqDerivative(fields: WallGo.Fields) -> WallGo.Fields: + return np.transpose( + [fields.getField(0)] + ) + + topQuark = WallGo.Particle( + "top", + index=0, + msqVacuum=topMsqVacuum, + msqDerivative=topMsqDerivative, + statistics="Fermion", + totalDOFs=12, + ) + self.addParticle(topQuark) + + +# end model + + +class EffectivePotentialQuarticZ2(WallGo.EffectivePotential): + """ + Effective potential for the QuarticZ2 model. + + This class inherits from the EffectivePotential class and provides the + necessary methods for calculating the effective potential. + """ + + # ~ EffectivePotential interface + fieldCount = 1 + """How many classical background fields""" + + effectivePotentialError = 1e-15 + """ + Relative accuracy at which the potential can be computed. + """ + + def __init__(self, owningModel: QuarticZ2) -> None: + """ + Initialize the EffectivePotentialQuarticZ2. + """ + + assert owningModel is not None, "Invalid model passed to Veff" + + self.owner = owningModel + self.modelParameters = self.owner.modelParameters + + # Count particle degrees-of-freedom to facilitate inclusion of + # light particle contributions to ideal gas pressure + self.numBosonDof = 29 + self.numFermionDof = 90 + + def evaluate( + self, fields: WallGo.Fields, temperature: float + ) -> float | np.ndarray: + """ + Evaluate the effective potential. + + Parameters + ---------- + fields: Fields + The field configuration + temperature: float + The temperature + + Returns + ---------- + potentialTotal: complex | np.ndarray + The value of the effective potential + """ + + # phi ~ 1/sqrt(2) (0, v), S ~ x + fields = WallGo.Fields(fields) + v = fields.getField(0) + + muSq = self.modelParameters["muSq"] + lam = self.modelParameters["lam"] + # We include a small cubic term to make the second minimum slightly deeper. + # Otherwise WallGo would not converge. + smallCubic = -1e-4 + + # tree level potential + potentialTree = ( + 0.5 * muSq * v**2 + + 0.25 * lam * v**4 + + smallCubic * v**3 / 3 + ) + + # Include only the T^4 terms in the potential + potentialTotal = ( + potentialTree + + self.constantTerms(temperature) + ) + + return np.array(potentialTotal) + + def constantTerms(self, temperature: np.ndarray | float) -> np.ndarray | float: + """Need to explicitly compute field-independent but T-dependent parts + that we don't already get from field-dependent loops. At leading order in high-T + expansion these are just (minus) the ideal gas pressure of light particles that + were not integrated over in the one-loop part. + + See Eq. (39) in hep-ph/0510375 for general LO formula + + + Parameters + ---------- + temperature: array-like (float) + The temperature + + Returns + ---------- + constantTerms: array-like (float) + The value of the field-independent contribution to the effective potential + """ + + # How many degrees of freedom we have left. The number of DOFs + # that were included in evaluate() is hardcoded + dofsBoson = self.numBosonDof - 14 + dofsFermion = self.numFermionDof - 12 # we only included top quark loops + + # Fermions contribute with a magic 7/8 prefactor as usual. Overall minus + # sign since Veff(min) = -pressure + return -(dofsBoson + 7.0 / 8.0 * dofsFermion) * np.pi**2 * temperature**4 / 90.0 + + +@pytest.mark.parametrize( + "muSq, lam", + [ + (-50**2, 0.05), + (-50**2, 0.5), + (-100**2, 0.05), + (-100**2, 0.5), + ] +) +def test_EOMSolver(muSq, lam): + """ + Compare the width of the wall computed by WallGo without out-of-equilibrium effects + to the exact result that solves the EOM in the Z2-symmetric quartic potential. + + Parameters + ---------- + muSq : float + Mass term. Must be negative. + lam : float + Quartic coupling. + + Returns + ------- + None. + + """ + + # Exact VEV + vev = np.sqrt(abs(muSq)/lam) + # Exact wall width + trueL = np.sqrt(2/abs(muSq)) + + # Initialise WallGo. Many parameters are now unimportant because we don't solve the + # Boltzmann equation + + Tn = 100 + + temperatureScale = Tn / 100 + fieldScale = vev + derivSettings = WallGo.VeffDerivativeSettings(temperatureVariationScale=float(temperatureScale), fieldValueVariationScale=fieldScale) + + modelParameters = {'muSq': muSq, 'lam': lam} + model = QuarticZ2(modelParameters) + model.getEffectivePotential().configureDerivatives(derivSettings) + + phaseInfo = WallGo.PhaseInfo(temperature = Tn, + phaseLocation1 = WallGo.Fields( [-vev]), + phaseLocation2 = WallGo.Fields( [vev] )) + + thermodynamics = WallGo.Thermodynamics( + model.getEffectivePotential(), + Tn, + phaseInfo.phaseLocation2, + phaseInfo.phaseLocation1, + ) + thermodynamics.freeEnergyHigh.newInterpolationTable(Tn/10, 10*Tn, 100) + thermodynamics.freeEnergyHigh.setExtrapolationType(WallGo.EExtrapolationType.CONSTANT, WallGo.EExtrapolationType.CONSTANT) + thermodynamics.freeEnergyLow.newInterpolationTable(Tn/10, 10*Tn, 100) + thermodynamics.freeEnergyLow.setExtrapolationType(WallGo.EExtrapolationType.CONSTANT, WallGo.EExtrapolationType.CONSTANT) + + # Hack to avoid complains from Hydrodynamics + thermodynamics.TMaxHighT = Tn-1e-6 + thermodynamics.TMaxLowT = Tn-1e-6 + thermodynamics.TMinHighT = Tn-1e-6 + thermodynamics.TMinLowT = Tn-1e-6 + thermodynamics.muMinHighT = 4 + thermodynamics.aMinHighT = 1 + thermodynamics.epsilonMinHighT = 1.5e-3*Tn**4 + thermodynamics.muMaxHighT = 4 + thermodynamics.aMaxHighT = 1 + thermodynamics.epsilonMaxHighT = 1.5e-3*Tn**4 + thermodynamics.muMinLowT = 4 + thermodynamics.aMinLowT = 1-3e-3 + thermodynamics.epsilonMinLowT = 0.0 + thermodynamics.muMaxLowT = 4 + thermodynamics.aMaxLowT = 1-3e-3 + thermodynamics.epsilonMaxLowT = 0.0 + + hydrodynamics = WallGo.Hydrodynamics(thermodynamics, 10, 0.1, rtol=1e-6, atol=1e-8) + grid = WallGo.Grid3Scales( + 50, + 11, + 3*trueL, + 3*trueL, + trueL, + Tn, + 0.75, + 0.1, + ) + boltzmannSolver = WallGo.BoltzmannSolver( + grid, + basisM="Cardinal", + basisN="Chebyshev", + collisionMultiplier=1, + ) + + eom = WallGo.EOM( + boltzmannSolver, + thermodynamics, + hydrodynamics, + grid, + 1, + 3*trueL, + [0.1, 100.0], + [-10,10], + includeOffEq=False, + forceEnergyConservation=False, + forceImproveConvergence=False, + errTol=1e-5, + maxIterations=20, + pressRelErrTol=0.01, + ) + + # Start with a wrong width to see if WallGo can find the correct one. + wallParams = WallGo.WallParams(widths=np.array([1.5*trueL]), offsets=np.array([0])) + # Computes the true wallParams. The wall velocity is irrelevant here. + ( + pressure, + wallParams, + boltzmannResults, + boltzmannBackground, + hydroResults, + ) = eom.wallPressure(0.3, wallParams) + + tanhError = eom.estimateTanhError(wallParams, boltzmannResults, boltzmannBackground, hydroResults)[0] + + # Compare the exact and WallGo wall widths + np.testing.assert_allclose(trueL, wallParams.widths[0], atol=0, rtol=1e-4) + # Make sure that the tanh error is small + np.testing.assert_allclose(tanhError, 0, atol=1e-8) \ No newline at end of file From 5a59347c6d633c8f84b0dd7d38da32f38cde9781 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:50:44 +0200 Subject: [PATCH 05/24] Merge pull request #19 from Wall-Go/userFreeEnergy User-provided free energy --- Models/InertDoubletModel/inertDoubletModel.py | 2 +- .../BM11HighT.txt | 397 +++ .../BM11LowT.txt | 2621 +++++++++++++++++ docs/source/faqs.rst | 12 + src/WallGo/__init__.py | 4 +- src/WallGo/containers.py | 51 + src/WallGo/equationOfMotion.py | 2 +- src/WallGo/exceptions.py | 1 - src/WallGo/freeEnergy.py | 86 +- src/WallGo/hydrodynamicsTemplateModel.py | 1 + src/WallGo/manager.py | 152 +- src/WallGo/results.py | 2 +- .../SingletSM_Z2/test_FreeEnergy.py | 78 +- 13 files changed, 3351 insertions(+), 58 deletions(-) create mode 100644 Models/InertDoubletModelApplicationsPaper/BM11HighT.txt create mode 100644 Models/InertDoubletModelApplicationsPaper/BM11LowT.txt diff --git a/Models/InertDoubletModel/inertDoubletModel.py b/Models/InertDoubletModel/inertDoubletModel.py index 1e0c1995..65a963fd 100644 --- a/Models/InertDoubletModel/inertDoubletModel.py +++ b/Models/InertDoubletModel/inertDoubletModel.py @@ -378,7 +378,7 @@ def jCW( # Note that we are taking the absolute value of the mass in the log here, # instead of using EImaginaryOption = ABS_ARGUMENT, because we do not - # want the absolute value in the product of massSq ans rgScale + # want the absolute value in the product of massSq and rgScale return degreesOfFreedom*np.array( massSq * massSq * (np.log(np.abs(massSq / rgScale**2)) - c) + 2 * massSq * rgScale**2 diff --git a/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt b/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt new file mode 100644 index 00000000..2c94ef14 --- /dev/null +++ b/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt @@ -0,0 +1,397 @@ +123.3 0. -2.798802311130195e9 +123.35 0. -2.8033338587535367e9 +123.39999999999999 0. -2.8078709177667623e9 +123.45 0. -2.8124134926248245e9 +123.5 0. -2.8169615877844954e9 +123.55 0. -2.8215152077043686e9 +123.6 0. -2.8260743568448625e9 +123.64999999999999 0. -2.8306390396682115e9 +123.7 0. -2.835209260638475e9 +123.75 0. -2.8397850242215295e9 +123.8 0. -2.8443663348850775e9 +123.85 0. -2.8489531970986385e9 +123.89999999999999 0. -2.8535456153335557e9 +123.95 0. -2.858143594062993e9 +124. 0. -2.862747137761931e9 +124.05 0. -2.867356250907177e9 +124.1 0. -2.8719709379773555e9 +124.14999999999999 0. -2.876591203452913e9 +124.2 0. -2.881217051816119e9 +124.25 0. -2.8858484875510583e9 +124.3 0. -2.8904855151436415e9 +124.35 0. -2.8951281390815973e9 +124.39999999999999 0. -2.899776363854477e9 +124.45 0. -2.904430193953652e9 +124.5 0. -2.90908963387231e9 +124.55 0. -2.9137546881054673e9 +124.6 0. -2.9184253611499534e9 +124.64999999999999 0. -2.9231016575044236e9 +124.7 0. -2.9277835816693516e9 +124.75 0. -2.9324711381470304e9 +124.8 0. -2.9371643314415736e9 +124.85 0. -2.941863166058918e9 +124.89999999999999 0. -2.946567624176511e9 +124.95 0. -2.951277664330914e9 +125. 0. -2.9559933591655707e9 +125.05 0. -2.960714713201627e9 +125.1 0. -2.9654417309620423e9 +125.14999999999999 0. -2.970174416971586e9 +125.2 0. -2.974912775756848e9 +125.25 0. -2.979656811846223e9 +125.3 0. -2.984406529769925e9 +125.35 0. -2.989161934059981e9 +125.39999999999999 0. -2.9939230292502327e9 +125.45 0. -2.9986898198763347e9 +125.5 0. -3.003462310475752e9 +125.55 0. -3.0082405055877666e9 +125.6 0. -3.0130244097534747e9 +125.64999999999999 0. -3.0178140275157843e9 +125.7 0. -3.0226093634194193e9 +125.75 0. -3.027410422010912e9 +125.8 0. -3.0322172078386145e9 +125.85 0. -3.0370297254526896e9 +125.89999999999999 0. -3.041847979405113e9 +125.95 0. -3.0466719742496777e9 +126. 0. -3.0515017145419836e9 +126.05 0. -3.056337204839451e9 +126.1 0. -3.0611784497013087e9 +126.14999999999999 0. -3.0660254536886024e9 +126.2 0. -3.070878221364191e9 +126.25 0. -3.0757367572927437e9 +126.3 0. -3.0806010660407467e9 +126.35 0. -3.0854711521764984e9 +126.39999999999999 0. -3.090347020270111e9 +126.45 0. -3.095228674893512e9 +126.5 0. -3.100116120620436e9 +126.55 0. -3.1050093620264378e9 +126.6 0. -3.1099084036888824e9 +126.64999999999999 0. -3.1148132501869516e9 +126.7 0. -3.1197239061016374e9 +126.75 0. -3.124640376015743e9 +126.8 0. -3.1295626645138903e9 +126.85 0. -3.1344907761825123e9 +126.89999999999999 0. -3.1394247156098547e9 +126.95 0. -3.1443644873859806e9 +127. 0. -3.149310096102758e9 +127.05 0. -3.1542615463538766e9 +127.1 0. -3.159218842734835e9 +127.14999999999999 0. -3.1641819898429475e9 +127.2 0. -3.169150992277342e9 +127.25 0. -3.1741258546389556e9 +127.3 0. -3.179106581530543e9 +127.35 0. -3.184093177556671e9 +127.39999999999999 0. -3.189085647323719e9 +127.45 0. -3.1940839954398823e9 +127.5 0. -3.199088226515165e9 +127.55 0. -3.2040983451613874e9 +127.6 0. -3.209114355992183e9 +127.64999999999999 0. -3.2141362636229987e9 +127.7 0. -3.219164072671095e9 +127.75 0. -3.2241977877555428e9 +127.8 0. -3.2292374134972286e9 +127.85 0. -3.234282954518851e9 +127.89999999999999 0. -3.239334415444926e9 +127.95 0. -3.244391800901778e9 +128. 0. -3.249455115517544e9 +128.05 0. -3.2545243639221783e9 +128.1 0. -3.2595995507474437e9 +128.15 0. -3.264680680626925e9 +128.2 0. -3.269767758196006e9 +128.25 0. -3.2748607880918984e9 +128.3 0. -3.279959774953618e9 +128.35 0. -3.2850647234219933e9 +128.4 0. -3.2901756381396737e9 +128.45 0. -3.2952925237511115e9 +128.5 0. -3.3004153849025836e9 +128.55 0. -3.305544226242171e9 +128.6 0. -3.310679052419766e9 +128.65 0. -3.315819868087087e9 +128.7 0. -3.3209666778976507e9 +128.75 0. -3.3261194865067973e9 +128.8 0. -3.331278298571675e9 +128.85 0. -3.3364431187512436e9 +128.9 0. -3.341613951706284e9 +128.95 0. -3.3467908020993776e9 +129. 0. -3.351973674594933e9 +129.05 0. -3.3571625738591623e9 +129.1 0. -3.3623575045600896e9 +129.15 0. -3.3675584713675613e9 +129.2 0. -3.3727654789532256e9 +129.25 0. -3.3779785319905562e9 +129.3 0. -3.383197635154827e9 +129.35 0. -3.388422793123131e9 +129.4 0. -3.393654010574377e9 +129.45 0. -3.398891292189281e9 +129.5 0. -3.404134642650377e9 +129.55 0. -3.409384066642008e9 +129.6 0. -3.41463956885033e9 +129.65 0. -3.4199011539633174e9 +129.7 0. -3.4251688266707487e9 +129.75 0. -3.430442591664227e9 +129.8 0. -3.4357224536371574e9 +129.85 0. -3.4410084172847595e9 +129.9 0. -3.4463004873040743e9 +129.95 0. -3.4515986683939443e9 +130. 0. -3.4569029652550354e9 +130.05 0. -3.4622133825898194e9 +130.1 0. -3.4675299251025805e9 +130.15 0. -3.472852597499423e9 +130.2 0. -3.478181404488254e9 +130.25 0. -3.483516350778805e9 +130.3 0. -3.4888574410826106e9 +130.35 0. -3.4942046801130176e9 +130.4 0. -3.4995580725851994e9 +130.45 0. -3.5049176232161236e9 +130.5 0. -3.5102833367245874e9 +130.55 0. -3.515655217831188e9 +130.6 0. -3.5210332712583394e9 +130.65 0. -3.5264175017302756e9 +130.7 0. -3.53180791397303e9 +130.75 0. -3.5372045127144623e9 +130.8 0. -3.542607302684236e9 +130.85 0. -3.5480162886138277e9 +130.9 0. -3.553431475236533e9 +130.95 0. -3.558852867287454e9 +131. 0. -3.564280469503512e9 +131.05 0. -3.569714286623433e9 +131.1 0. -3.5751543233877583e9 +131.15 0. -3.580600584538849e9 +131.2 0. -3.5860530748208675e9 +131.25 0. -3.5915117989797997e9 +131.3 0. -3.5969767617634373e9 +131.35 0. -3.602447967921383e9 +131.4 0. -3.607925422205063e9 +131.45 0. -3.6134091293677006e9 +131.5 0. -3.6188990941643486e9 +131.55 0. -3.62439532135186e9 +131.6 0. -3.6298978156889014e9 +131.65 0. -3.6354065819359612e9 +131.7 0. -3.6409216248553286e9 +131.75 0. -3.646442949211118e9 +131.8 0. -3.651970559769245e9 +131.85 0. -3.657504461297442e9 +131.9 0. -3.6630446585652575e9 +131.95 0. -3.668591156344047e9 +132. 0. -3.6741439594069834e9 +132.05 0. -3.67970307252905e9 +132.1 0. -3.685268500487039e9 +132.15 0. -3.690840248059565e9 +132.2 0. -3.696418320027042e9 +132.25 0. -3.7020027211717124e9 +132.3 0. -3.707593456277617e9 +132.35 0. -3.713190530130613e9 +132.4 0. -3.7187939475183764e9 +132.45 0. -3.7244037132303877e9 +132.5 0. -3.7300198320579457e9 +132.55 0. -3.73564230879416e9 +132.6 0. -3.741271148233947e9 +132.65 0. -3.7469063551740484e9 +132.7 0. -3.7525479344130025e9 +132.75 0. -3.758195890751177e9 +132.8 0. -3.76385022899074e9 +132.85 0. -3.76951095393567e9 +132.9 0. -3.775178070391772e9 +132.95 0. -3.7808515831666484e9 +133. 0. -3.7865314970697293e9 +133.05 0. -3.792217816912241e9 +133.1 0. -3.797910547507231e9 +133.15 0. -3.8036096936695633e9 +133.2 0. -3.8093152602159023e9 +133.25 0. -3.8150272519647374e9 +133.3 0. -3.8207456737363634e9 +133.35 0. -3.8264705303528867e9 +133.4 0. -3.832201826638232e9 +133.45 0. -3.837939567418128e9 +133.5 0. -3.8436837575201283e9 +133.55 0. -3.8494344017735868e9 +133.6 0. -3.8551915050096703e9 +133.65 0. -3.8609550720613694e9 +133.7 0. -3.866725107763475e9 +133.75 0. -3.872501616952597e9 +133.8 0. -3.8782846044671574e9 +133.85 0. -3.8840740751473823e9 +133.9 0. -3.889870033835326e9 +133.95 0. -3.8956724853748364e9 +134. 0. -3.901481434611593e9 +134.05 0. -3.907296886393073e9 +134.1 0. -3.9131188455685663e9 +134.15 0. -3.9189473169891887e9 +134.2 0. -3.9247823055078526e9 +134.25 0. -3.9306238159792953e9 +134.3 0. -3.9364718532600565e9 +134.35 0. -3.942326422208491e9 +134.4 0. -3.948187527684772e9 +134.45 0. -3.9540551745508757e9 +134.5 0. -3.959929367670599e9 +134.55 0. -3.965810111909546e9 +134.6 0. -3.97169741213513e9 +134.65 0. -3.9775912732165866e9 +134.7 0. -3.9834917000249534e9 +134.75 0. -3.989398697433091e9 +134.8 0. -3.9953122703156624e9 +134.85 0. -4.0012324235491424e9 +134.9 0. -4.0071591620118284e9 +134.95 0. -4.0130924905838203e9 +135. 0. -4.0190324141470356e9 +135.05 0. -4.024978937585202e9 +135.1 0. -4.0309320657838573e9 +135.15 0. -4.0368918036303587e9 +135.2 0. -4.0428581560138636e9 +135.25 0. -4.048831127825355e9 +135.3 0. -4.05481072395762e9 +135.35 0. -4.060796949305256e9 +135.4 0. -4.066789808764683e9 +135.45 0. -4.072789307234118e9 +135.5 0. -4.07879544961361e9 +135.55 0. -4.0848082408050003e9 +135.6 0. -4.09082768571195e9 +135.65 0. -4.0968537882232585e9 +135.7 0. -4.102886554242669e9 +135.75 0. -4.1089259886975994e9 +135.8 0. -4.1149720964989552e9 +135.85 0. -4.1210248825594606e9 +135.9 0. -4.1270843517936525e9 +135.95 0. -4.133150509117876e9 +136. 0. -4.139223359450295e9 +136.05 0. -4.14530290771088e9 +136.1 0. -4.1513891588214083e9 +136.15 0. -4.1574821177054853e9 +136.2 0. -4.163581789288513e9 +136.25 0. -4.169688178497715e9 +136.3 0. -4.1758012902621226e9 +136.35 0. -4.181921129512577e9 +136.4 0. -4.188047701181741e9 +136.45 0. -4.194181010204076e9 +136.5 0. -4.2003210615158677e9 +136.55 0. -4.206467860055208e9 +136.6 0. -4.2126214107619967e9 +136.65 0. -4.218781718577958e9 +136.7 0. -4.2249487884466133e9 +136.75 0. -4.2311226253133125e9 +136.8 0. -4.237303234125201e9 +136.85 0. -4.243490619831243e9 +136.9 0. -4.249684787382222e9 +136.95 0. -4.25588574173072e9 +137. 0. -4.2620934878311434e9 +137.05 0. -4.268308030639703e9 +137.1 0. -4.274529375114421e9 +137.15 0. -4.280757526215139e9 +137.2 0. -4.286992488903501e9 +137.25 0. -4.293234268142974e9 +137.3 0. -4.2994828688988285e9 +137.35 0. -4.305738296138144e9 +137.4 0. -4.312000554829824e9 +137.45 0. -4.318269649944574e9 +137.5 0. -4.324545586454918e9 +137.55 0. -4.330828369335187e9 +137.6 0. -4.3371180035615225e9 +137.65 0. -4.343414494111887e9 +137.7 0. -4.349717845966042e9 +137.75 0. -4.356028064105576e9 +137.8 0. -4.362345153513878e9 +137.85 0. -4.3686691191761465e9 +137.9 0. -4.374999966079408e9 +137.95 0. -4.381337699212482e9 +138. 0. -4.387682323566017e9 +138.05 0. -4.39403384413246e9 +138.1 0. -4.400392265906072e9 +138.15 0. -4.406757593882935e9 +138.2 0. -4.413129833060932e9 +138.25 0. -4.419508988439767e9 +138.3 0. -4.425895065020949e9 +138.35 0. -4.432288067807799e9 +138.4 0. -4.438688001805457e9 +138.45 0. -4.4450948720208645e9 +138.5 0. -4.451508683462789e9 +138.55 0. -4.457929441141794e9 +138.6 0. -4.464357150070262e9 +138.65 0. -4.470791815262393e9 +138.7 0. -4.477233441734186e9 +138.75 0. -4.4836820345034685e9 +138.8 0. -4.490137598589865e9 +138.85 0. -4.496600139014814e9 +138.9 0. -4.503069660801577e9 +138.95 0. -4.509546168975212e9 +139. 0. -4.516029668562603e9 +139.05 0. -4.522520164592436e9 +139.1 0. -4.529017662095208e9 +139.15 0. -4.535522166103241e9 +139.2 0. -4.542033681650648e9 +139.25 0. -4.548552213773379e9 +139.3 0. -4.555077767509172e9 +139.35 0. -4.561610347897587e9 +139.4 0. -4.568149959980003e9 +139.45 0. -4.574696608799596e9 +139.5 0. -4.581250299401366e9 +139.55 0. -4.587811036832119e9 +139.6 0. -4.594378826140469e9 +139.65 0. -4.600953672376854e9 +139.7 0. -4.607535580593509e9 +139.75 0. -4.614124555844496e9 +139.8 0. -4.620720603185677e9 +139.85 0. -4.627323727674725e9 +139.9 0. -4.633933934371135e9 +139.95 0. -4.640551228336203e9 +140. 0. -4.647175614633051e9 +140.05 0. -4.653807098326595e9 +140.1 0. -4.660445684483571e9 +140.15 0. -4.667091378172533e9 +140.2 0. -4.673744184463832e9 +140.25 0. -4.680404108429647e9 +140.3 0. -4.68707113514934e9 +140.35 0. -4.693745286726935e9 +140.4 0. -4.700426571167453e9 +140.45 0. -4.70711499355129e9 +140.5 0. -4.713810558960669e9 +140.55 0. -4.720513272479611e9 +140.6 0. -4.7272231391939535e9 +140.65 0. -4.733940164191351e9 +140.7 0. -4.740664352561255e9 +140.75 0. -4.747395709394944e9 +140.8 0. -4.754134239785496e9 +140.85 0. -4.760879948827799e9 +140.9 0. -4.767632841618563e9 +140.95 0. -4.774392923256295e9 +141. 0. -4.78116019884133e9 +141.05 0. -4.787934673475796e9 +141.1 0. -4.794716352263639e9 +141.15 0. -4.801505240310624e9 +141.2 0. -4.808301342724312e9 +141.25 0. -4.81510466461409e9 +141.3 0. -4.821915211091145e9 +141.35 0. -4.828732987268474e9 +141.4 0. -4.835557998260898e9 +141.45 0. -4.842390249185031e9 +141.5 0. -4.849229745159315e9 +141.55 0. -4.856076491303994e9 +141.6 0. -4.862930492741117e9 +141.65 0. -4.869791754594559e9 +141.7 0. -4.876660281989991e9 +141.75 0. -4.88353608005491e9 +141.8 0. -4.890419153918609e9 +141.85 0. -4.897309508712196e9 +141.9 0. -4.904207149568601e9 +141.95 0. -4.911112081622547e9 +142. 0. -4.918024310010584e9 +142.05 0. -4.924943839871062e9 +142.1 0. -4.931870676344145e9 +142.15 0. -4.938804824571811e9 +142.2 0. -4.945746289697844e9 +142.25 0. -4.952695076867846e9 +142.3 0. -4.959651191229223e9 +142.35 0. -4.966614637931187e9 +142.4 0. -4.973585422124779e9 +142.45 0. -4.98056354896283e9 +142.5 0. -4.9875490236e9 +142.55 0. -4.994541851192749e9 +142.6 0. -5.0015420368993435e9 +142.65 0. -5.008549585879878e9 +142.7 0. -5.015564503296237e9 +142.75 0. -5.022586794312137e9 +142.8 0. -5.029616464093088e9 +142.85 0. -5.036653517806416e9 +142.9 0. -5.043697960621265e9 +142.95 0. -5.050749797708578e9 +143. 0. -5.057809034241123e9 +143.05 0. -5.064875675393463e9 +143.1 0. -5.071949726341982e9 \ No newline at end of file diff --git a/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt b/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt new file mode 100644 index 00000000..5f610f8e --- /dev/null +++ b/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt @@ -0,0 +1,2621 @@ +112. 167.57865210639014 -1.921533883472978e9 +112.005 167.56555305802544 -1.9218665282199435e9 +112.01 167.55229765104897 -1.9221992189852955e9 +112.015 167.53903837895177 -1.9225319557860675e9 +112.02 167.52577524019344 -1.922864738626681e9 +112.025 167.51250823323235 -1.9231975675115566e9 +112.03 167.49923735652578 -1.9235304424451127e9 +112.035 167.48596260853003 -1.9238633634317708e9 +112.04 167.4726839876999 -1.9241963304759517e9 +112.045 167.45940149248915 -1.9245293435820756e9 +112.05 167.44611512135046 -1.9248624027545652e9 +112.055 167.43282487273515 -1.9251955079978414e9 +112.06 167.41953074509365 -1.9255286593163252e9 +112.065 167.40623273687513 -1.9258618567144387e9 +112.07 167.39293084652735 -1.9261951001966054e9 +112.075 167.37962507249713 -1.926528389767248e9 +112.08 167.3663154132302 -1.926861725430788e9 +112.085 167.35300186717083 -1.9271951071916487e9 +112.09 167.33968443276225 -1.927528535054255e9 +112.095 167.32636310844663 -1.9278620090230289e9 +112.1 167.313037892665 -1.928195529102394e9 +112.105 167.2997087838567 -1.928529095296777e9 +112.11 167.2863757804606 -1.9288627076105993e9 +112.115 167.27303888091384 -1.9291963660482872e9 +112.12 167.25969808365244 -1.929530070614266e9 +112.125 167.24635338711192 -1.9298638213129587e9 +112.13 167.23300478972553 -1.9301976181487927e9 +112.135 167.21965228992616 -1.9305314611261942e9 +112.14 167.20629588614517 -1.9308653502495868e9 +112.145 167.19293557681283 -1.9311992855233989e9 +112.15 167.1795713603579 -1.9315332669520564e9 +112.155 167.16620323520874 -1.931867294539985e9 +112.16 167.1528311997915 -1.9322013682916126e9 +112.165 167.13945525253175 -1.9325354882113671e9 +112.17 167.12607539185402 -1.9328696543036754e9 +112.175 167.11269161618108 -1.9332038665729647e9 +112.18 167.0993039239349 -1.9335381250236642e9 +112.185 167.08591231353614 -1.9338724296602006e9 +112.19 167.07251678340427 -1.9342067804870038e9 +112.195 167.05911733195754 -1.9345411775085027e9 +112.2 167.0457139576129 -1.9348756207291262e9 +112.205 167.0323066587863 -1.9352101101533031e9 +112.21 167.01889543389242 -1.9355446457854636e9 +112.215 167.00548028134457 -1.9358792276300378e9 +112.22 166.99206119955505 -1.9362138556914554e9 +112.225 166.9786381869349 -1.9365485299741464e9 +112.23 166.96521124189374 -1.936883250482543e9 +112.235 166.9517803628404 -1.9372180172210736e9 +112.24 166.93834554818213 -1.9375528301941712e9 +112.245 166.92490679632502 -1.9378876894062684e9 +112.25 166.91741499677246 -1.9382225947646759e9 +112.255 166.90930400702067 -1.938557545253676e9 +112.26 166.89585662488105 -1.9388925419165583e9 +112.265 166.88240526244442 -1.9392275848357449e9 +112.27 166.86894991808188 -1.9395626740156755e9 +112.275 166.8554905901629 -1.9398978094607882e9 +112.28 166.8420272770562 -1.9402329911755178e9 +112.285 166.82855997712878 -1.9405682191643038e9 +112.29 166.8150886887468 -1.9409034934315848e9 +112.295 166.80161341027485 -1.9412388139817972e9 +112.3 166.78813414007644 -1.941574180819381e9 +112.305 166.77465087651365 -1.9419095939487762e9 +112.31 166.76116361794746 -1.9422450533744192e9 +112.315 166.74767236273735 -1.942580559100751e9 +112.32 166.7341771092419 -1.942916111132211e9 +112.325 166.72067785581805 -1.9432517094732406e9 +112.33 166.70717460082184 -1.9435873541282768e9 +112.335 166.69366734260774 -1.9439230451017625e9 +112.34 166.68015607952896 -1.9442587823981388e9 +112.345 166.6666408099377 -1.9445945660218449e9 +112.35 166.65312153218457 -1.944930395977323e9 +112.355 166.639598244619 -1.9452662722690148e9 +112.36 166.62607094558942 -1.945602194901361e9 +112.365 166.6125396334425 -1.9459381638788044e9 +112.37 166.59900430652397 -1.946274179205789e9 +112.375 166.58546496317823 -1.946610240886755e9 +112.38 166.57192160174836 -1.946946348926145e9 +112.385 166.55837422057596 -1.9472825033284051e9 +112.39 166.54482281800173 -1.9476187040979757e9 +112.395 166.53126739236487 -1.9479549512393012e9 +112.4 166.51770794200326 -1.9482912447568269e9 +112.405 166.50414446525346 -1.9486275846549945e9 +112.41 166.49057696045085 -1.9489639709382508e9 +112.415 166.4770054259296 -1.9493004036110404e9 +112.42 166.46342986002222 -1.9496368826778054e9 +112.425 166.4498502610604 -1.9499734081429942e9 +112.43 166.43626662737415 -1.9503099800110521e9 +112.435 166.42267895729248 -1.9506465982864227e9 +112.44 166.4090872491428 -1.9509832629735534e9 +112.445 166.39549150125146 -1.9513199740768902e9 +112.45 166.38189171194327 -1.9516567316008816e9 +112.455 166.3682878795421 -1.951993535549971e9 +112.46 166.35468000237015 -1.9523303859286075e9 +112.465 166.34106807874838 -1.9526672827412395e9 +112.47 166.32745210699667 -1.9530042259923124e9 +112.475 166.3138320854334 -1.953341215686275e9 +112.48 166.30020801237566 -1.9536782518275764e9 +112.485 166.28657988613918 -1.9540153344206634e9 +112.49 166.27294770503852 -1.9543524634699855e9 +112.495 166.25931146738688 -1.9546896389799926e9 +112.5 166.24567117149581 -1.955026860955132e9 +112.505 166.2320268156761 -1.9553641293998547e9 +112.51 166.2183783982369 -1.9557014443186102e9 +112.515 166.20472591748606 -1.9560388057158473e9 +112.52 166.19106937173012 -1.9563762135960178e9 +112.525 166.17740875927436 -1.9567136679635725e9 +112.53 166.1637440784226 -1.957051168822961e9 +112.535 166.1500753274774 -1.957388716178635e9 +112.54 166.13640250474006 -1.9577263100350466e9 +112.545 166.12272560851045 -1.9580639503966453e9 +112.55 166.1090446370872 -1.9584016372678845e9 +112.555 166.09535958876734 -1.9587393706532176e9 +112.56 166.08167046184718 -1.959077150557094e9 +112.565 166.06797725462096 -1.9594149769839687e9 +112.57 166.05427996538202 -1.9597528499382942e9 +112.575 166.04057859242218 -1.9600907694245238e9 +112.58 166.026873134032 -1.9604287354471107e9 +112.585 166.01316358850073 -1.960766748010508e9 +112.59 165.9994499541162 -1.961104807119172e9 +112.595 165.98573222916488 -1.961442912777554e9 +112.6 165.97201041193208 -1.9617810649901104e9 +112.605 165.95828450070135 -1.9621192637612972e9 +112.61 165.94455449375536 -1.9624575090955667e9 +112.615 165.93082038937519 -1.9627958009973752e9 +112.62 165.9170821858405 -1.9631341394711807e9 +112.625 165.90333988142982 -1.9634725245214353e9 +112.63 165.88959347442008 -1.9638109561525974e9 +112.635 165.87584296308697 -1.964149434369124e9 +112.64 165.86208834570485 -1.9644879591754704e9 +112.645 165.84832962054662 -1.964826530576094e9 +112.65 165.841524119308 -1.9651651484456549e9 +112.655 165.82876157772208 -1.9655038127493327e9 +112.66 165.8149928448007 -1.9658425236577995e9 +112.665 165.80121999492272 -1.966181281178208e9 +112.67 165.7874430263503 -1.9665200853150148e9 +112.675 165.77366193734397 -1.9668589360726788e9 +112.68 165.75987672616318 -1.9671978334556603e9 +112.685 165.74608739106546 -1.9675367774684167e9 +112.69 165.73229393030763 -1.9678757681154077e9 +112.695 165.71849634214468 -1.968214805401094e9 +112.7 165.70469462483024 -1.9685538893299365e9 +112.705 165.6908887766168 -1.9688930199063923e9 +112.71 165.67707879575508 -1.9692321971349247e9 +112.715 165.66326468049488 -1.9695714210199935e9 +112.72 165.6494464290844 -1.9699106915660598e9 +112.725 165.63562403977016 -1.9702500087775843e9 +112.73 165.6217975107977 -1.9705893726590314e9 +112.735 165.6080536547841 -1.9709287832115488e9 +112.74 165.59421884756313 -1.9712682404362507e9 +112.745 165.5803798722921 -1.971607744344261e9 +112.75 165.56653672719182 -1.9719472949400427e9 +112.755 165.55268941048192 -1.9722868922280626e9 +112.76 165.5390120067708 -1.9726265361990516e9 +112.765 165.52515633792865 -1.9729662268649657e9 +112.77 165.51129644565341 -1.9733059642365198e9 +112.775 165.49743232812017 -1.9736457483181849e9 +112.78 165.48356398350296 -1.973985579114433e9 +112.785 165.46969140997402 -1.974325456629737e9 +112.79 165.45581460570412 -1.9746653808685699e9 +112.795 165.44193356886288 -1.975005351835404e9 +112.8 165.4280482976179 -1.975345369534713e9 +112.805 165.41415879013573 -1.975685433970972e9 +112.81 165.40026504458126 -1.9760255451486533e9 +112.815 165.38636705911793 -1.9763657030722313e9 +112.82 165.3724648319078 -1.9767059077461803e9 +112.825 165.35855836111125 -1.9770461591749775e9 +112.83 165.34464764488717 -1.977386457363095e9 +112.835 165.33073268139321 -1.977726802315009e9 +112.84 165.31681346878537 -1.9780671940351963e9 +112.845 165.30289000521816 -1.9784076325281312e9 +112.85 165.28896228884446 -1.9787481177982895e9 +112.855 165.2750303178158 -1.97908864985015e9 +112.86 165.2610940902824 -1.9794292286881874e9 +112.865 165.24715360439262 -1.9797698543168788e9 +112.87 165.23320885829344 -1.9801105267407024e9 +112.875 165.21925985013053 -1.9804512459641347e9 +112.88 165.2053065780476 -1.9807920119916544e9 +112.885 165.19134904018753 -1.981132824827739e9 +112.89 165.17738723469108 -1.9814736844768665e9 +112.895 165.16342115969766 -1.9818145909435163e9 +112.9 165.14945081334534 -1.9821555442321677e9 +112.905 165.13547619377053 -1.9824965443472986e9 +112.91 165.1214972991082 -1.9828375912933884e9 +112.915 165.10751412749164 -1.9831786850749187e9 +112.92 165.09352667705292 -1.9835198256963675e9 +112.925 165.07953494592243 -1.9838610131622152e9 +112.93 165.06553893222866 -1.984202247476945e9 +112.935 165.05153863409927 -1.984543528645034e9 +112.94 165.03753404966002 -1.9848848566709647e9 +112.945 165.02352517703505 -1.9852262315592198e9 +112.95 165.009512014347 -1.9855676533142805e9 +112.955 164.99549455971734 -1.985909121940627e9 +112.96 164.98147281126555 -1.9862506374427428e9 +112.965 164.9674467671099 -1.986592199825111e9 +112.97 164.95341642536678 -1.9869338090922132e9 +112.975 164.9393817841515 -1.9872754652485323e9 +112.98 164.92534284157716 -1.9876171682985532e9 +112.985 164.91129959575602 -1.9879589182467577e9 +112.99 164.8972520447985 -1.9883007150976305e9 +112.995 164.88320018681338 -1.9886425588556561e9 +113. 164.86914401990802 -1.9889844495253177e9 +113.005 164.85508354218823 -1.9893263871111007e9 +113.01 164.8410187517581 -1.9896683716174917e9 +113.015 164.82694964672044 -1.990010403048973e9 +113.02 164.81287622517624 -1.9903524814100313e9 +113.025 164.79879848522498 -1.9906946067051544e9 +113.03 164.7847164249648 -1.9910367789388244e9 +113.035 164.7706300424922 -1.9913789981155303e9 +113.04 164.75653933590172 -1.9917212642397597e9 +113.045 164.742444303287 -1.9920635773159966e9 +113.05 164.72834494273948 -1.9924059373487296e9 +113.055 164.71424125234955 -1.9927483443424473e9 +113.06 164.70013323020558 -1.9930907983016355e9 +113.065 164.68602087439479 -1.993433299230783e9 +113.07 164.6719041830025 -1.993775847134378e9 +113.075 164.6577831541126 -1.9941184420169106e9 +113.08 164.64365778580733 -1.9944610838828666e9 +113.085 164.62952807616747 -1.9948037727367375e9 +113.09 164.61539402327202 -1.9951465085830126e9 +113.095 164.60125562519866 -1.9954892914261804e9 +113.1 164.5871128800232 -1.9958321212707307e9 +113.105 164.57296578582012 -1.9961749981211557e9 +113.11 164.55881434066202 -1.9965179219819438e9 +113.115 164.54465854262028 -1.9968608928575866e9 +113.12 164.53049838976435 -1.9972039107525764e9 +113.125 164.5163338801623 -1.9975469756714025e9 +113.13 164.5021650118804 -1.9978900876185575e9 +113.135 164.48799178298347 -1.9982332465985339e9 +113.14 164.47381419153484 -1.9985764526158218e9 +113.145 164.4596322355959 -1.9989197056749153e9 +113.15 164.44544591322685 -1.999263005780308e9 +113.155 164.43125522248585 -1.999606352936491e9 +113.16 164.41706016142967 -1.9999497471479585e9 +113.165 164.40286072811367 -2.0002931884192042e9 +113.17 164.38865692059122 -2.0006366767547216e9 +113.175 164.3744487369143 -2.0009802121590042e9 +113.18 164.36023617513297 -2.001323794636549e9 +113.185 164.34601923329637 -2.0016674241918464e9 +113.19 164.33179790945127 -2.0020111008293953e9 +113.195 164.31757220164317 -2.0023548245536888e9 +113.2 164.30334210791597 -2.0026985953692234e9 +113.205 164.2891076263117 -2.003042413280494e9 +113.21 164.27486875487088 -2.0033862782919981e9 +113.215 164.26062549163268 -2.0037301904082313e9 +113.22 164.24637783463436 -2.0040741496336894e9 +113.225 164.2328210370806 -2.0044181559500191e9 +113.23 164.21856478487115 -2.0047622093468573e9 +113.235 164.20430411881014 -2.005106309866392e9 +113.24 164.1900390369148 -2.0054504575131202e9 +113.245 164.17576953720024 -2.0057946522915454e9 +113.25 164.16149561768037 -2.0061388942061636e9 +113.255 164.14721727636723 -2.0064831832614756e9 +113.26 164.1329345112711 -2.006827519461983e9 +113.265 164.11864732040078 -2.0071719028121843e9 +113.27 164.1043557017633 -2.0075163333165805e9 +113.275 164.09005965336405 -2.0078608109796736e9 +113.28 164.07575917320673 -2.0082053358059633e9 +113.285 164.06145425929319 -2.008549907799952e9 +113.29 164.04714490962417 -2.008894526966142e9 +113.295 164.03283112219805 -2.0092391933090343e9 +113.3 164.0185128950119 -2.0095839068331316e9 +113.305 164.00419022606116 -2.0099286675429378e9 +113.31 163.9898631133393 -2.010273475442953e9 +113.315 163.9755315548383 -2.010618330537683e9 +113.32 163.96119554854846 -2.0109632328316298e9 +113.325 163.94685509245826 -2.0113081823293e9 +113.33 163.9325101845547 -2.0116531790351932e9 +113.335 163.91816082282284 -2.011998222953816e9 +113.34 163.90380700524616 -2.012343314089675e9 +113.345 163.88944872980656 -2.0126884524472706e9 +113.35 163.87508599448407 -2.0130336380311108e9 +113.355 163.86071879725708 -2.0133788708457022e9 +113.36 163.84634713610222 -2.0137241508955472e9 +113.365 163.83197100899443 -2.014069478185155e9 +113.37 163.81759041390697 -2.0144148527190304e9 +113.375 163.80320534881145 -2.0147602745016794e9 +113.38 163.78881581167775 -2.0151057435376096e9 +113.385 163.77442180047393 -2.015451259831329e9 +113.39 163.7600233131663 -2.015796823387344e9 +113.395 163.74562034771958 -2.0161424342101607e9 +113.4 163.7312129020969 -2.0164880923042912e9 +113.405 163.71680097425923 -2.0168337976742399e9 +113.41 163.70238456216623 -2.0171795503245165e9 +113.415 163.68796366377566 -2.0175253502596319e9 +113.42 163.67353827704358 -2.0178711974840925e9 +113.425 163.65910839992424 -2.0182170920024087e9 +113.43 163.64467403037028 -2.0185630338190906e9 +113.435 163.63023516633257 -2.0189090229386473e9 +113.44 163.61579180576018 -2.0192550593655891e9 +113.445 163.60134394660057 -2.0196011431044273e9 +113.45 163.58689158679908 -2.0199472741596737e9 +113.455 163.57243472429988 -2.020293452535836e9 +113.46 163.557973357045 -2.0206396782374287e9 +113.465 163.54350748297475 -2.0209859512689629e9 +113.47 163.5290371000279 -2.0213322716349494e9 +113.475 163.51456220614125 -2.0216786393399014e9 +113.48 163.50008279924998 -2.0220250543883317e9 +113.485 163.48559887728734 -2.0223715167847505e9 +113.49 163.47120997666926 -2.0227180265230799e9 +113.495 163.45671701078942 -2.0230645836178317e9 +113.5 163.44221949724346 -2.0234111880741148e9 +113.505 163.42771743393456 -2.0237578398964477e9 +113.51 163.41341039927454 -2.024104539078848e9 +113.515 163.39889924056502 -2.024451285624409e9 +113.52 163.38438347278841 -2.0247980795495727e9 +113.525 163.36986309379324 -2.0251449208588653e9 +113.53 163.35533810142618 -2.025491809556807e9 +113.535 163.34080849353205 -2.0258387456479256e9 +113.54 163.32627426795378 -2.026185729136745e9 +113.545 163.31173542253248 -2.0265327600277896e9 +113.55 163.29719195510722 -2.0268798383255858e9 +113.555 163.2826438635155 -2.0272269640346603e9 +113.56 163.26809114559276 -2.0275741371595364e9 +113.565 163.2535337991725 -2.0279213577047417e9 +113.57 163.2389718220865 -2.0282686256748035e9 +113.575 163.2244052121646 -2.0286159410742488e9 +113.58 163.20983396723466 -2.028963303907603e9 +113.585 163.19525808512284 -2.029310714179395e9 +113.59 163.18067756365318 -2.0296581718941534e9 +113.595 163.1660924006481 -2.0300056770564036e9 +113.6 163.15150259392792 -2.0303532296706762e9 +113.605 163.13690814131107 -2.0307008297414994e9 +113.61 163.1223090406143 -2.0310484772734013e9 +113.615 163.1077052896522 -2.0313961722709112e9 +113.62 163.09309688623762 -2.031743914738561e9 +113.625 163.07848382818136 -2.0320917046808767e9 +113.63 163.0638661132925 -2.0324395421023908e9 +113.635 163.04924373937808 -2.0327874270076344e9 +113.64 163.0346167042433 -2.0331353594011345e9 +113.645 163.01998500569127 -2.0334833392874255e9 +113.65 163.00534864152334 -2.033831366671039e9 +113.655 162.99070760953921 -2.0341794415565035e9 +113.66 162.9760619075361 -2.0345275639483523e9 +113.665 162.96141153330956 -2.0348757338511195e9 +113.67 162.94675648465335 -2.0352239512693338e9 +113.675 162.93209675935927 -2.0355722162075307e9 +113.68 162.91743235521682 -2.0359205286702437e9 +113.685 162.90276327001405 -2.0362688886620026e9 +113.69 162.8880895015369 -2.0366172961873436e9 +113.695 162.87341104756922 -2.0369657512508004e9 +113.7 162.85872790589303 -2.0373142538569074e9 +113.705 162.84404007428859 -2.0376628040101979e9 +113.71 162.82934755053384 -2.038011401715207e9 +113.715 162.8146503324051 -2.0383600469764707e9 +113.72 162.79994841767663 -2.0387087397985234e9 +113.725 162.78524180412063 -2.0390574801859007e9 +113.73 162.77053048950737 -2.0394062681431398e9 +113.735 162.75581447160553 -2.0397551036747746e9 +113.74 162.74109374818124 -2.040103986785344e9 +113.745 162.72636831699901 -2.0404529174793835e9 +113.75 162.71163817582132 -2.0408018957614303e9 +113.755 162.6969033224088 -2.0411509216360211e9 +113.76 162.68216375451985 -2.0414999951076958e9 +113.765 162.66741946991118 -2.0418491161809902e9 +113.77 162.65267046633727 -2.042198284860443e9 +113.775 162.63791674155078 -2.0425475011505942e9 +113.78 162.6231582933023 -2.0428967650559802e9 +113.785 162.60839511934066 -2.043246076581142e9 +113.79 162.59362721741223 -2.0435954357306192e9 +113.795 162.57885458526198 -2.04394484250895e9 +113.8 162.56407722063244 -2.0442942969206743e9 +113.805 162.5492951212643 -2.0446437989703355e9 +113.81 162.5345082848963 -2.0449933486624703e9 +113.815 162.51971670926517 -2.0453429460016224e9 +113.82 162.5049203921056 -2.0456925909923315e9 +113.825 162.49011933115017 -2.0460422836391397e9 +113.83 162.47531352412975 -2.0463920239465883e9 +113.835 162.4605029687729 -2.04674181191922e9 +113.84 162.44568766280617 -2.047091647561577e9 +113.845 162.4308676039544 -2.0474415308782015e9 +113.85 162.41604278994018 -2.0477914618736365e9 +113.855 162.4012132184841 -2.0481414405524263e9 +113.86 162.3863788873046 -2.048491466919113e9 +113.865 162.3715397941185 -2.0488415409782417e9 +113.87 162.3566959366403 -2.049191662734356e9 +113.875 162.34184731258244 -2.0495418321919997e9 +113.88 162.32699391965537 -2.0498920493557186e9 +113.885 162.3121357555675 -2.0502423142300575e9 +113.89 162.2972728180254 -2.0505926268195605e9 +113.895 162.28240510473327 -2.050942987128774e9 +113.9 162.26753261339346 -2.0512933951622453e9 +113.905 162.25265534170623 -2.0516438509245188e9 +113.91 162.2377732873699 -2.051994354420141e9 +113.915 162.22288644808052 -2.0523449056536608e9 +113.92 162.20799482153228 -2.0526955046296225e9 +113.925 162.19309840541715 -2.0530461513525739e9 +113.93 162.17819719742536 -2.0533968458270648e9 +113.935 162.16621636786962 -2.0537475879446423e9 +113.94 162.15130641095698 -2.0540983776161904e9 +113.945 162.13639155072477 -2.0544492150528262e9 +113.95 162.12147178475612 -2.0548001002591102e9 +113.955 162.10654711063162 -2.0551510332396016e9 +113.96 162.0916175259299 -2.0555020139988625e9 +113.965 162.07668302822728 -2.0558530425414538e9 +113.97 162.06174361509767 -2.0562041188719368e9 +113.975 162.04679928411326 -2.0565552429948733e9 +113.98 162.03185003284364 -2.0569064149148264e9 +113.985 162.01689585885626 -2.0572576346363566e9 +113.99 162.00193675971659 -2.057608902164028e9 +113.995 161.98697273298748 -2.0579602175024045e9 +114. 161.97200377622997 -2.0583115806560466e9 +114.005 161.95702988700268 -2.0586629916295195e9 +114.01 161.94205106286182 -2.059014450427389e9 +114.015 161.92706730136186 -2.0593659570542161e9 +114.02 161.9120786000545 -2.0597175115145662e9 +114.025 161.89708495648946 -2.0600691138130069e9 +114.03 161.88208636821443 -2.0604207639541e9 +114.035 161.8670828327745 -2.060772461942412e9 +114.04 161.85207434771266 -2.0611242077825098e9 +114.045 161.83706091056973 -2.0614760014789572e9 +114.05 161.82204251888416 -2.061827843036323e9 +114.055 161.8070191701921 -2.0621797324591725e9 +114.06 161.7919908620278 -2.0625316697520723e9 +114.065 161.77695759192278 -2.0628836549195914e9 +114.07 161.76191935740658 -2.0632356879662957e9 +114.075 161.74687615600635 -2.0635877688967543e9 +114.08 161.73182798524724 -2.0639398977155347e9 +114.085 161.7167748426516 -2.064292074427205e9 +114.09 161.70171672574006 -2.064644299036336e9 +114.095 161.68665363203078 -2.0649965715474942e9 +114.1 161.67158555903939 -2.065348891965251e9 +114.105 161.65651250427962 -2.0657012602941751e9 +114.11 161.64143446526282 -2.0660536765388367e9 +114.115 161.62635143949774 -2.0664061407038064e9 +114.12 161.61126342449126 -2.0667586527936559e9 +114.125 161.59617041774771 -2.067111212812954e9 +114.13 161.58107241676927 -2.067463820766272e9 +114.135 161.56596941905562 -2.0678164766581845e9 +114.14 161.5508614221044 -2.0681691804932601e9 +114.145 161.5357484234107 -2.0685219322760725e9 +114.15 161.5206304204674 -2.0688747320111952e9 +114.155 161.50550741076523 -2.0692275797031987e9 +114.16 161.4903793917923 -2.0695804753566556e9 +114.165 161.4752463610345 -2.0699334189761438e9 +114.17 161.4601083159757 -2.0702864105662324e9 +114.175 161.44496525409696 -2.0706394501314974e9 +114.18 161.42981717287728 -2.0709925376765134e9 +114.185 161.41466406979322 -2.071345673205854e9 +114.19 161.3995059423194 -2.0716988567240949e9 +114.195 161.38434278792735 -2.072052088235811e9 +114.2 161.36917460408688 -2.0724053677455792e9 +114.205 161.35400138826532 -2.0727586952579727e9 +114.21 161.33882313792748 -2.0731120707775688e9 +114.215 161.32363985053598 -2.0734654943089457e9 +114.22 161.30845152355113 -2.0738189658566785e9 +114.225 161.29325815443065 -2.0741724854253445e9 +114.23 161.27805974063 -2.0745260530195222e9 +114.235 161.26285627960254 -2.0748796686437867e9 +114.24 161.24776247775358 -2.0752333323004391e9 +114.245 161.23254893134347 -2.0755870439860036e9 +114.25 161.21733029972194 -2.075940803715391e9 +114.255 161.202106580303 -2.0762946114931834e9 +114.26 161.18687777049809 -2.0766484673239646e9 +114.265 161.17187391509393 -2.0770023711901765e9 +114.27 161.15663490833575 -2.0773563231154056e9 +114.275 161.14139074240668 -2.077710323107378e9 +114.28 161.1261414146484 -2.07806437117068e9 +114.285 161.11088692239963 -2.078418467309906e9 +114.29 161.09562726299674 -2.0787726115296457e9 +114.295 161.0803624337737 -2.0791268038344908e9 +114.3 161.06509243206182 -2.0794810442290328e9 +114.305 161.0498172551898 -2.079835332717865e9 +114.31 161.0345369004839 -2.0801896693055787e9 +114.315 161.01925136526805 -2.0805440539967663e9 +114.32 161.00396064686316 -2.0808984867960222e9 +114.325 160.9886647425882 -2.0812529677079394e9 +114.33 160.97336364975928 -2.0816074967371109e9 +114.335 160.9580573656897 -2.0819620738881314e9 +114.34 160.94274588769082 -2.0823166991655967e9 +114.345 160.92742921307098 -2.0826713725740979e9 +114.35 160.9121073391361 -2.0830260941182325e9 +114.355 160.8967802631896 -2.083380863802596e9 +114.36 160.8814479825322 -2.083735681631783e9 +114.365 160.86611049446225 -2.0840905476103895e9 +114.37 160.85076779627528 -2.084445461743013e9 +114.375 160.83541988526449 -2.0848004240342476e9 +114.38 160.82006675872037 -2.0851554344886918e9 +114.385 160.80470841393074 -2.0855104931109447e9 +114.39 160.78934484818123 -2.0858655999055996e9 +114.395 160.77397605875422 -2.0862207548772578e9 +114.4 160.75860204293008 -2.0865759580305164e9 +114.405 160.74322279798653 -2.086931209369974e9 +114.41 160.72783832119825 -2.0872865089002283e9 +114.415 160.7124486098378 -2.08764185662588e9 +114.42 160.69705366117478 -2.087997252551528e9 +114.425 160.68165347247646 -2.0883526966817708e9 +114.43 160.66624804100738 -2.0887081890212111e9 +114.435 160.65083736402954 -2.0890637295744472e9 +114.44 160.6354214388021 -2.0894193183460803e9 +114.445 160.62000026258167 -2.0897749553407116e9 +114.45 160.60457383262238 -2.090130640562943e9 +114.455 160.5891421461758 -2.0904863740173755e9 +114.46 160.57370520049042 -2.0908421557086105e9 +114.465 160.55826299281253 -2.0911979856412525e9 +114.47 160.54281552038555 -2.091553863819902e9 +114.475 160.52736278045052 -2.0919097902491622e9 +114.48 160.51190477024542 -2.0922657649336376e9 +114.485 160.49644148700588 -2.0926217878779309e9 +114.49 160.48097292796476 -2.0929778590866458e9 +114.495 160.4654990903522 -2.0933339785643876e9 +114.5 160.45001997139596 -2.0936901463157601e9 +114.505 160.43453556832063 -2.094046362345368e9 +114.51 160.41904587834864 -2.0944026266578178e9 +114.515 160.40355089869954 -2.0947589392577124e9 +114.52 160.38805062659017 -2.0951153001496594e9 +114.525 160.37254505923445 -2.0954717093382664e9 +114.53 160.3570341938441 -2.095828166828137e9 +114.535 160.34151802762784 -2.09618467262388e9 +114.54 160.32599655779177 -2.0965412267301023e9 +114.545 160.31046978153924 -2.0968978291514103e9 +114.55 160.29493769607097 -2.0972544798924122e9 +114.555 160.27940029858485 -2.0976111789577172e9 +114.56 160.26385758627643 -2.0979679263519318e9 +114.565 160.2483095563379 -2.0983247220796661e9 +114.57 160.2327562059592 -2.0986815661455288e9 +114.575 160.2171975323275 -2.0990384585541303e9 +114.58 160.2016335326271 -2.0993953993100784e9 +114.585 160.18606420403987 -2.0997523884179835e9 +114.59 160.17048954374428 -2.1001094258824587e9 +114.595 160.15490954891703 -2.1004665117081108e9 +114.6 160.13932421673115 -2.1008236458995526e9 +114.605 160.12373354435752 -2.1011808284613967e9 +114.61 160.10813752896394 -2.1015380593982518e9 +114.615 160.09253616771585 -2.1018953387147317e9 +114.62 160.07692945777535 -2.1022526664154496e9 +114.625 160.06131739630231 -2.1026100425050156e9 +114.63 160.04569998045346 -2.1029674669880445e9 +114.635 160.03007720738304 -2.1033249398691492e9 +114.64 160.0144490742425 -2.1036824611529431e9 +114.645 159.99881557818009 -2.10404003084404e9 +114.65 159.98317671634186 -2.1043976489470541e9 +114.655 159.96753248587086 -2.1047553154666e9 +114.66 159.951882883907 -2.1051130304072928e9 +114.665 159.93622790758803 -2.1054707937737489e9 +114.67 159.92056755404826 -2.1058286055705807e9 +114.675 159.90490182041975 -2.106186465802407e9 +114.68 159.8892307038313 -2.106544374473843e9 +114.685 159.8735542014093 -2.1069023315895047e9 +114.69 159.8578723102771 -2.1072603371540089e9 +114.695 159.84218502755516 -2.1076183911719735e9 +114.7 159.82649235036124 -2.1079764936480157e9 +114.705 159.81079427581034 -2.1083346445867534e9 +114.71 159.79509080101454 -2.1086928439928038e9 +114.715 159.779381923083 -2.1090510918707874e9 +114.72 159.76366763912213 -2.1094093882253206e9 +114.725 159.7479479462358 -2.1097677330610237e9 +114.73 159.73222284152425 -2.110126126382517e9 +114.735 159.7164923220856 -2.1104845681944184e9 +114.74 159.7007563850149 -2.1108430585013483e9 +114.745 159.6850150274042 -2.111201597307929e9 +114.75 159.66926824634294 -2.111560184618779e9 +114.755 159.6535160389174 -2.11191882043852e9 +114.76 159.63775840221112 -2.1122775047717748e9 +114.765 159.62199533330494 -2.1126362376231627e9 +114.77 159.6062268292765 -2.1129950189973068e9 +114.775 159.59045288720068 -2.1133538488988311e9 +114.78 159.5746735041496 -2.113712727332356e9 +114.785 159.5588886771924 -2.1140716543025045e9 +114.79 159.54309840339522 -2.1144306298139026e9 +114.795 159.52730267982145 -2.1147896538711705e9 +114.8 159.51150150353152 -2.1151487264789338e9 +114.805 159.4956948715829 -2.1155078476418183e9 +114.81 159.47988278103017 -2.115867017364446e9 +114.815 159.46406522892514 -2.1162262356514432e9 +114.82 159.44824221231647 -2.116585502507435e9 +114.825 159.4324137282499 -2.116944817937048e9 +114.83 159.41657977376852 -2.1173041819449062e9 +114.835 159.40074034591217 -2.1176635945356379e9 +114.84 159.38489544171784 -2.1180230557138689e9 +114.845 159.3690450582197 -2.1183825654842246e9 +114.85 159.35318919244892 -2.118742123851334e9 +114.855 159.3373278414335 -2.1191017308198261e9 +114.86 159.32146100219884 -2.1194613863943257e9 +114.865 159.3055886717672 -2.119821090579462e9 +114.87 159.28971084715766 -2.1201808433798654e9 +114.875 159.2738275253867 -2.1205406448001626e9 +114.88 159.25793870346766 -2.1209004948449838e9 +114.885 159.2420443784109 -2.1212603935189595e9 +114.89 159.22614454722373 -2.1216203408267174e9 +114.895 159.2102392069107 -2.1219803367728884e9 +114.9 159.19432835447301 -2.122340381362106e9 +114.905 159.17841198690934 -2.1227004745989966e9 +114.91 159.1624901012149 -2.123060616488193e9 +114.915 159.1465626943819 -2.12342080703433e9 +114.92 159.13062976340024 -2.1237810462420344e9 +114.925 159.1146913052559 -2.124141334115941e9 +114.93 159.0987473169323 -2.124501670660683e9 +114.935 159.08279779540993 -2.1248620558808913e9 +114.94 159.06684273766598 -2.1252224897812004e9 +114.945 159.05088214067464 -2.1255829723662434e9 +114.95 159.03491600140714 -2.1259435036406555e9 +114.955 159.01894431683192 -2.1263040836090689e9 +114.96 159.00296708391394 -2.1266647122761183e9 +114.965 158.98698429961533 -2.1270253896464405e9 +114.97 158.97099596089504 -2.1273861157246685e9 +114.975 158.95500206470928 -2.127746890515439e9 +114.98 158.9390026080108 -2.128107714023388e9 +114.985 158.92299758774945 -2.12846858625315e9 +114.99 158.90698700087196 -2.1288295072093635e9 +114.995 158.89110382827937 -2.1291904768887784e9 +115. 158.87508210740907 -2.1295514952975175e9 +115.005 158.859054775505 -2.1299125624466195e9 +115.01 158.84302182946453 -2.1302736783407269e9 +115.015 158.82724992413807 -2.130634842972195e9 +115.02 158.82971030501935 -2.1309960555526664e9 +115.025 158.8366147438256 -2.1313573145103254e9 +115.03 158.84351918263272 -2.1317186198036485e9 +115.035 158.85042362143906 -2.1320799714366243e9 +115.04 158.8391049590425 -2.132441370178689e9 +115.045 158.8230639617796 -2.1328028176434715e9 +115.05 158.80701708883404 -2.1331643138869257e9 +115.055 158.79096433681198 -2.1335258589137247e9 +115.06 158.7749057023161 -2.1338874527285361e9 +115.065 158.75884118194546 -2.1342490953360326e9 +115.07 158.74277077229542 -2.1346107867408862e9 +115.075 158.726694469958 -2.1349725269477687e9 +115.08 158.71061227152154 -2.1353343159613523e9 +115.085 158.69452417357093 -2.1356961537863095e9 +115.09 158.67843017268697 -2.1360580404273152e9 +115.095 158.66233026544774 -2.136419975889039e9 +115.1 158.6462244484268 -2.1367819601761575e9 +115.105 158.63011271819457 -2.137143993293346e9 +115.11 158.61399507131802 -2.1375060752452755e9 +115.115 158.59787150435997 -2.1378682060366232e9 +115.12 158.58174201388024 -2.1382303856720645e9 +115.125 158.56560659643455 -2.1385926141562736e9 +115.13 158.54946524857513 -2.1389548914939275e9 +115.135 158.53331796685052 -2.1393172176897027e9 +115.14 158.5171647478059 -2.1396795927482746e9 +115.145 158.5010055879823 -2.1400420166743207e9 +115.15 158.48484048391745 -2.14040448947252e9 +115.155 158.46866943214545 -2.1407670111475482e9 +115.16 158.45249242919655 -2.1411295817040842e9 +115.165 158.43630947159733 -2.1414922011468067e9 +115.17 158.42012055587082 -2.141854869480394e9 +115.175 158.40392567853613 -2.1422175867095258e9 +115.18 158.387724836109 -2.1425803528388815e9 +115.185 158.3715180251012 -2.1429431678731406e9 +115.19 158.3553052420211 -2.1433060318169832e9 +115.195 158.33908648337285 -2.1436689446750906e9 +115.2 158.32286174565738 -2.1440319064521449e9 +115.205 158.3066310253717 -2.1443949171528249e9 +115.21 158.29039431900924 -2.1447579767818131e9 +115.215 158.27415162305917 -2.1451210853437939e9 +115.22 158.2579029340077 -2.1454842428434465e9 +115.225 158.2416482483367 -2.1458474492854552e9 +115.23 158.22538756252462 -2.1462107046745038e9 +115.235 158.20912087304598 -2.1465740090152748e9 +115.24 158.19284817637154 -2.1469373623124523e9 +115.245 158.17656946896838 -2.147300764570721e9 +115.25 158.1602847472998 -2.1476642157947645e9 +115.255 158.1439940078252 -2.148027715989269e9 +115.26 158.12769724700036 -2.1483912651589193e9 +115.265 158.11139446127723 -2.1487548633084e9 +115.27 158.09508564710367 -2.1491185104424e9 +115.275 158.0787708009241 -2.1494822065656037e9 +115.28 158.0624499191791 -2.1498459516826973e9 +115.285 158.04612299830544 -2.1502097457983685e9 +115.29 158.02979003473567 -2.150573588917307e9 +115.295 158.013451024899 -2.150937481044198e9 +115.3 157.99710596522047 -2.15130142218373e9 +115.305 157.98075485212155 -2.151665412340593e9 +115.31 157.96439768201986 -2.1520294515194745e9 +115.315 157.94803445132885 -2.1523935397250643e9 +115.32 157.93166515645817 -2.152757676962053e9 +115.325 157.91528979381403 -2.1531218632351303e9 +115.33 157.89890835979838 -2.153486098548986e9 +115.335 157.88252085080927 -2.1538503829083114e9 +115.34 157.86612726324108 -2.154214716317798e9 +115.345 157.84972759348423 -2.1545790987821364e9 +115.35 157.8333218379252 -2.1549435303060193e9 +115.355 157.81690999294653 -2.1553080108941383e9 +115.36 157.800492054927 -2.1556725405511866e9 +115.365 157.78406802024134 -2.1560371192818565e9 +115.37 157.76763788526014 -2.156401747090843e9 +115.375 157.75120164635072 -2.156766423982838e9 +115.38 157.73475929987583 -2.1571311499625363e9 +115.385 157.7183108421946 -2.1574959250346336e9 +115.39 157.70185626966207 -2.1578607492038217e9 +115.395 157.6853955786294 -2.158225622474798e9 +115.4 157.66892876544364 -2.1585905448522587e9 +115.405 157.6524558264484 -2.158955516340898e9 +115.41 157.63597675798246 -2.1593205369454126e9 +115.415 157.61949155638135 -2.1596856066705008e9 +115.42 157.60300021797622 -2.160050725520858e9 +115.425 157.58650273909433 -2.1604158935011806e9 +115.43 157.56999911605922 -2.1607811106161695e9 +115.435 157.55348934518994 -2.16114637687052e9 +115.44 157.53697342280185 -2.1615116922689314e9 +115.445 157.52045134520614 -2.161877056816103e9 +115.45 157.50392310870998 -2.162242470516736e9 +115.455 157.48738870961677 -2.1626079333755264e9 +115.46 157.47084814422547 -2.1629734453971753e9 +115.465 157.4543014088313 -2.163339006586385e9 +115.47 157.43774849972536 -2.1637046169478536e9 +115.475 157.42118941319455 -2.1640702764862833e9 +115.48 157.40462414552186 -2.164435985206377e9 +115.485 157.38805269298626 -2.164801743112834e9 +115.49 157.37147505186232 -2.1651675502103577e9 +115.495 157.35489121842102 -2.1655334065036516e9 +115.5 157.33830118892874 -2.165899311997417e9 +115.505 157.32170495964806 -2.1662652666963577e9 +115.51 157.3051025268376 -2.1666312706051784e9 +115.515 157.2884938867514 -2.1669973237285824e9 +115.52 157.27187903563984 -2.167363426071274e9 +115.525 157.2552579697489 -2.167729577637959e9 +115.53 157.23863068532066 -2.16809577843334e9 +115.535 157.2219971785926 -2.168462028462126e9 +115.54 157.2053574457986 -2.168828327729021e9 +115.545 157.18871148316825 -2.1691946762387304e9 +115.55 157.17205928692678 -2.169561073995963e9 +115.555 157.15540085329525 -2.1699275210054255e9 +115.56 157.13873617849086 -2.1702940172718234e9 +115.565 157.12206525872654 -2.170660562799866e9 +115.57 157.10538809021057 -2.171027157594261e9 +115.575 157.08870466914757 -2.1713938016597195e9 +115.58 157.07201499173803 -2.171760495000946e9 +115.585 157.05531905417777 -2.1721272376226516e9 +115.59 157.0386168526585 -2.1724940295295477e9 +115.595 157.02190838336813 -2.1728608707263417e9 +115.6 157.00519364248984 -2.173227761217746e9 +115.605 156.98847262620285 -2.173594701008471e9 +115.61 156.97174533068215 -2.173961690103226e9 +115.615 156.95501175209827 -2.174328728506725e9 +115.62 156.9382718866176 -2.174695816223679e9 +115.625 156.9215257304025 -2.1750629532587996e9 +115.63 156.90477327961068 -2.1754301396167994e9 +115.635 156.88801453039568 -2.1757973753023934e9 +115.64 156.87124947890703 -2.1761646603202925e9 +115.645 156.85447812128953 -2.176531994675212e9 +115.65 156.83770045368396 -2.176899378371866e9 +115.655 156.82091647222677 -2.1772668114149694e9 +115.66 156.80412617305024 -2.1776342938092346e9 +115.665 156.787329552282 -2.17800182555938e9 +115.67 156.77052660604537 -2.1783694066701193e9 +115.675 156.75371733045972 -2.178737037146169e9 +115.68 156.73690172163975 -2.179104716992248e9 +115.685 156.72007977569584 -2.179472446213069e9 +115.69 156.70325148873428 -2.17984022481335e9 +115.695 156.68641685685657 -2.1802080527978106e9 +115.7 156.66957587616008 -2.1805759301711683e9 +115.705 156.65272854273772 -2.1809438569381404e9 +115.71 156.6358748526784 -2.181311833103445e9 +115.715 156.61901480206603 -2.181679858671804e9 +115.72 156.6021483869805 -2.182047933647933e9 +115.725 156.5852756034971 -2.182416058036555e9 +115.73 156.56839644768698 -2.182784231842389e9 +115.735 156.55151091561652 -2.183152455070155e9 +115.74 156.53461900334798 -2.183520727724574e9 +115.745 156.51772070693883 -2.1838890498103704e9 +115.75 156.5008160224427 -2.1842574213322606e9 +115.755 156.48390494590797 -2.1846258422949696e9 +115.76 156.4669874733791 -2.184994312703222e9 +115.765 156.4502188535396 -2.1853628325577927e9 +115.77 156.43328860376238 -2.185731401855014e9 +115.775 156.41635190469412 -2.186100020611947e9 +115.78 156.3994087523117 -2.186468688833317e9 +115.785 156.38277048101494 -2.1868374065137415e9 +115.79 156.36581445844763 -2.1872061736455503e9 +115.795 156.34885188721634 -2.1875749902559834e9 +115.8 156.3318827631778 -2.1879438563497787e9 +115.805 156.31490708218374 -2.188312771931678e9 +115.81 156.29792484008144 -2.188681737006418e9 +115.815 156.28093603271327 -2.18905075157874e9 +115.82 156.26394065591677 -2.1894198156533833e9 +115.825 156.24693870552468 -2.18978892923509e9 +115.83 156.22993017736502 -2.190158092328598e9 +115.835 156.21291506726092 -2.1905273049386525e9 +115.84 156.19589337103076 -2.190896567069993e9 +115.845 156.178865084488 -2.1912658787273617e9 +115.85 156.1618302034414 -2.1916352399155016e9 +115.855 156.1447887236946 -2.1920046506391563e9 +115.86 156.12774064104676 -2.1923741109030676e9 +115.865 156.1106859512919 -2.192743620711979e9 +115.87 156.09362465021917 -2.193113180070637e9 +115.875 156.07655673361307 -2.1934827889837847e9 +115.88 156.05948219725295 -2.193852447456166e9 +115.885 156.0424010369135 -2.1942221554925284e9 +115.89 156.02531324836423 -2.1945919130976157e9 +115.895 156.00821882736983 -2.194961720276175e9 +115.9 155.9911177696903 -2.1953315770329533e9 +115.905 155.9740100710805 -2.195701483372696e9 +115.91 155.9568957272902 -2.1960714393001513e9 +115.915 155.93977473406463 -2.1964414448200674e9 +115.92 155.9226470871437 -2.196811499937191e9 +115.925 155.90551278226255 -2.197181604656271e9 +115.93 155.8894748366051 -2.1975517589170613e9 +115.935 155.87232759096554 -2.1979219627639256e9 +115.94 155.8551736509602 -2.1982922162269583e9 +115.945 155.83801301227152 -2.198662519310913e9 +115.95 155.8208456705769 -2.199032872020542e9 +115.955 155.80367162154826 -2.1994032743605967e9 +115.96 155.78649086085315 -2.1997737263358316e9 +115.965 155.7693033841533 -2.2001442279510007e9 +115.97 155.7521091871059 -2.2005147792108555e9 +115.975 155.73490826536252 -2.2008853801201534e9 +115.98 155.7177006145702 -2.201256030683648e9 +115.985 155.7004862303703 -2.2016267309060936e9 +115.99 155.6832651083994 -2.2019974807922473e9 +115.995 155.66603724428867 -2.2023682803468647e9 +116. 155.65310111751555 -2.202739129244088e9 +116.005 155.63586120948358 -2.203110027709009e9 +116.01 155.61861439082503 -2.2034809758565216e9 +116.015 155.6013606569504 -2.2038519736913967e9 +116.02 155.58410000326484 -2.20422302121841e9 +116.025 155.56683242516775 -2.204594118442337e9 +116.03 155.54955791805332 -2.2049652653679504e9 +116.035 155.53227647730978 -2.2053364620000257e9 +116.04 155.51498809832023 -2.205707708343341e9 +116.045 155.49769277646192 -2.20607900440267e9 +116.05 155.48039050710653 -2.20645035018279e9 +116.055 155.46308128562032 -2.2068217456884794e9 +116.06 155.44576510736388 -2.207193190924513e9 +116.065 155.428441967692 -2.2075646858956695e9 +116.07 155.41111186195428 -2.2079362306067286e9 +116.075 155.39377478549412 -2.2083078250624695e9 +116.08 155.37643073364987 -2.2086794692676687e9 +116.085 155.3590797017538 -2.2090511632271066e9 +116.09 155.34172168513274 -2.2094229069455643e9 +116.095 155.32435667910786 -2.2097947004278216e9 +116.1 155.30698467899455 -2.210166543678658e9 +116.105 155.28960568010234 -2.2105384367028575e9 +116.11 155.27221967773548 -2.2109103795051994e9 +116.115 155.25482666719233 -2.2112823720904655e9 +116.12 155.23742664376533 -2.211654414463441e9 +116.125 155.22001960274133 -2.212026506628906e9 +116.13 155.20260553940153 -2.212398648591645e9 +116.135 155.18518444902128 -2.212770840356443e9 +116.14 155.1677563268704 -2.2131430819280815e9 +116.145 155.15032116821243 -2.213515373311347e9 +116.15 155.13287896830545 -2.213887714511025e9 +116.155 155.1154297224018 -2.214260105531899e9 +116.16 155.09797342574808 -2.214632546378757e9 +116.165 155.08051007358458 -2.2150050370563846e9 +116.17 155.06303966114643 -2.215377577569567e9 +116.175 155.0455621836625 -2.215750167923094e9 +116.18 155.02807763635585 -2.2161228081217523e9 +116.185 155.0105860144437 -2.216495498170328e9 +116.19 154.99308731313758 -2.2168682380736117e9 +116.195 154.9755815276429 -2.217241027836392e9 +116.2 154.95806865315933 -2.217613867463459e9 +116.205 154.9405486848805 -2.217986756959601e9 +116.21 154.92302161799427 -2.218359696329608e9 +116.215 154.90548744768248 -2.2187326855782723e9 +116.22 154.88794616912122 -2.2191057247103834e9 +116.225 154.87039777748032 -2.219478813730733e9 +116.23 154.85284226792385 -2.2198519526441145e9 +116.235 154.83527963560977 -2.2202251414553185e9 +116.24 154.81770987569044 -2.220598380169137e9 +116.245 154.8001329833117 -2.2209716687903666e9 +116.25 154.78254895361377 -2.2213450073237977e9 +116.255 154.7649577817307 -2.221718395774226e9 +116.26 154.7473594627904 -2.222091834146446e9 +116.265 154.7297539919151 -2.2224653224452515e9 +116.27 154.71214136422066 -2.222838860675438e9 +116.275 154.69452157481695 -2.223212448841803e9 +116.28 154.67689461880795 -2.2235860869491405e9 +116.285 154.65926049129115 -2.223959775002249e9 +116.29 154.64161918735846 -2.224333513005925e9 +116.295 154.62397070209528 -2.224707300964966e9 +116.3 154.60631503058113 -2.2250811388841677e9 +116.305 154.5886521678893 -2.225455026768333e9 +116.31 154.57098210908697 -2.2258289646222563e9 +116.315 154.55330484923516 -2.22620295245074e9 +116.32 154.53562038338865 -2.2265769902585816e9 +116.325 154.51792870659622 -2.2269510780505834e9 +116.33 154.50022981390026 -2.2273252158315444e9 +116.335 154.48252370033714 -2.227699403606266e9 +116.34 154.46481036093692 -2.22807364137955e9 +116.345 154.4470897907235 -2.2284479291561975e9 +116.35 154.4293619847145 -2.2288222669410114e9 +116.355 154.41162693792123 -2.229196654738795e9 +116.36 154.39388464534895 -2.22957109255435e9 +116.365 154.3761351019964 -2.22994558039248e9 +116.37 154.3583783028562 -2.2303201182579913e9 +116.375 154.34061424291457 -2.230694706155686e9 +116.38 154.32284291715166 -2.23106934409037e9 +116.385 154.30506432054088 -2.2314440320668488e9 +116.39 154.2872784480499 -2.2318187700899286e9 +116.395 154.26948529463945 -2.232193558164414e9 +116.4 154.25168485526416 -2.2325683962951136e9 +116.405 154.23387712487244 -2.2329432844868336e9 +116.41 154.2160620984061 -2.233318222744381e9 +116.415 154.19823977080068 -2.233693211072565e9 +116.42 154.18041013698524 -2.2340682494761934e9 +116.425 154.16257319188256 -2.234443337960075e9 +116.43 154.1447289304088 -2.2348184765290203e9 +116.435 154.1268773474737 -2.235193665187837e9 +116.44 154.1090184379809 -2.2355689039413357e9 +116.445 154.09115219682704 -2.2359441927943287e9 +116.45 154.07327861890266 -2.236319531751627e9 +116.455 154.05539769909174 -2.23669492081804e9 +116.46 154.03750943227158 -2.2370703599983807e9 +116.465 154.0196138133131 -2.237445849297463e9 +116.47 154.0017108370809 -2.2378213887200975e9 +116.475 153.98380049843263 -2.2381969782710986e9 +116.48 153.96588279221967 -2.2385726179552813e9 +116.485 153.94795771328666 -2.2389483077774568e9 +116.49 153.93002525647196 -2.2393240477424417e9 +116.495 153.9120854166068 -2.239699837855052e9 +116.5 153.89413818851645 -2.2400756781201005e9 +116.505 153.87618356701915 -2.2404515685424047e9 +116.51 153.8582215469266 -2.2408275091267815e9 +116.515 153.84043472548547 -2.2412034998699102e9 +116.52 153.82245791965332 -2.241579540774215e9 +116.525 153.80447365024892 -2.2419556318550453e9 +116.53 153.78648191199025 -2.242331773117221e9 +116.535 153.7688489176412 -2.2427079645391564e9 +116.54 153.75084225424675 -2.243084206141088e9 +116.545 153.73282800678385 -2.243460497938841e9 +116.55 153.71480616980483 -2.2438368399372516e9 +116.555 153.6967767378549 -2.2442132321411543e9 +116.56 153.67873970547228 -2.2445896745553856e9 +116.565 153.66069506718782 -2.2449661671847816e9 +116.57 153.64264281752537 -2.2453427100341806e9 +116.575 153.6245829510015 -2.245719303108421e9 +116.58 153.60651546212574 -2.2460959464123373e9 +116.585 153.58844034540047 -2.246472639950771e9 +116.59 153.57035759532047 -2.246849383728561e9 +116.595 153.55226720637387 -2.247226177750544e9 +116.6 153.534169173041 -2.2476030220215626e9 +116.605 153.51606348979544 -2.247979916546457e9 +116.61 153.49795015110314 -2.248356861330065e9 +116.615 153.47982915142273 -2.248733856377231e9 +116.62 153.46170048520582 -2.249110901692796e9 +116.625 153.44356414689682 -2.2494879972816014e9 +116.63 153.42542013093217 -2.24986514314849e9 +116.635 153.4072684317417 -2.2502423392983065e9 +116.64 153.38910904374748 -2.250619585735892e9 +116.645 153.37094196136397 -2.2509968824660916e9 +116.65 153.3527671789991 -2.2513742294937515e9 +116.655 153.33458469105253 -2.251751626823714e9 +116.66 153.3163944919168 -2.2521290744608254e9 +116.665 153.2981965759772 -2.2525065724099336e9 +116.67 153.27999093761133 -2.252884120675882e9 +116.675 153.2617775711895 -2.2532617192635193e9 +116.68 153.24355647107436 -2.253639368177694e9 +116.685 153.22532763162116 -2.25401706742325e9 +116.69 153.20709104717784 -2.2543948170050387e9 +116.695 153.18884671208457 -2.2547726169279084e9 +116.7 153.17059462067374 -2.2551504671967096e9 +116.705 153.15233476727093 -2.255528367816289e9 +116.71 153.13406714619344 -2.2559063187914977e9 +116.715 153.11579175175117 -2.2562843201271887e9 +116.72 153.09750857824673 -2.256662371828211e9 +116.725 153.0792176199749 -2.2570404738994155e9 +116.73 153.06091887122273 -2.2574186263456564e9 +116.735 153.04261232626965 -2.257796829171785e9 +116.74 153.02429797938754 -2.2581750823826547e9 +116.745 153.0059758248405 -2.25855338598312e9 +116.75 152.98764585688502 -2.258931739978032e9 +116.755 152.96930806976988 -2.2593101443722477e9 +116.76 152.950962457736 -2.2596885991706223e9 +116.765 152.93260901501682 -2.260067104378009e9 +116.77 152.91424773583768 -2.2604456599992647e9 +116.775 152.89587861441638 -2.260824266039248e9 +116.78 152.87750164496288 -2.261202922502812e9 +116.785 152.85911682167932 -2.261581629394816e9 +116.79 152.8407241387599 -2.2619603867201185e9 +116.795 152.82232359039136 -2.262339194483577e9 +116.8 152.80391517075213 -2.262718052690048e9 +116.805 152.785498874013 -2.263096961344396e9 +116.81 152.76707469433683 -2.263475920451475e9 +116.815 152.74864262587855 -2.2638549300161495e9 +116.82 152.73020266278527 -2.2642339900432777e9 +116.825 152.71175479919606 -2.264613100537722e9 +116.83 152.69329902924198 -2.264992261504344e9 +116.835 152.67483534704633 -2.2653714729480042e9 +116.84 152.6563637467242 -2.2657507348735676e9 +116.845 152.63788422238278 -2.266130047285896e9 +116.85 152.61939676812122 -2.266509410189853e9 +116.855 152.6009013780307 -2.2668888235903044e9 +116.86 152.5823980461943 -2.2672682874921107e9 +116.865 152.5638867666869 -2.267647801900141e9 +116.87 152.54536753357547 -2.268027366819259e9 +116.875 152.52684034091874 -2.2684069822543306e9 +116.88 152.50830518276743 -2.2687866482102222e9 +116.885 152.4897620531641 -2.269166364691803e9 +116.89 152.47121094614315 -2.269546131703937e9 +116.895 152.45265185573066 -2.2699259492514944e9 +116.9 152.43408477594454 -2.2703058173393435e9 +116.905 152.4155097007948 -2.270685735972353e9 +116.91 152.39692662428297 -2.2710657051553907e9 +116.915 152.37833554040222 -2.271445724893329e9 +116.92 152.35973644313776 -2.2718257951910367e9 +116.925 152.34112932646644 -2.272205916053385e9 +116.93 152.32251418435638 -2.2725860874852457e9 +116.935 152.303891010768 -2.2729663094914894e9 +116.94 152.2852597996531 -2.27334658207699e9 +116.945 152.26662054495506 -2.2737269052466197e9 +116.95 152.24797324060913 -2.274107279005252e9 +116.955 152.22931788054188 -2.2744877033577604e9 +116.96 152.21065445867168 -2.2748681783090186e9 +116.965 152.19198296890843 -2.275248703863903e9 +116.97 152.1733034051536 -2.2756292800272875e9 +116.975 152.15461576130016 -2.2760099068040476e9 +116.98 152.13592003123247 -2.2763905841990623e9 +116.985 152.1172162088267 -2.2767713122172046e9 +116.99 152.09850428795028 -2.2771520908633533e9 +116.995 152.07978426246214 -2.2775329201423883e9 +117. 152.06105612621283 -2.277913800059184e9 +117.005 152.04231987304397 -2.2782947306186213e9 +117.01 152.02357549678896 -2.2786757118255796e9 +117.015 152.0048229912723 -2.2790567436849375e9 +117.02 151.9860623503102 -2.279437826201576e9 +117.025 151.96729356770973 -2.279818959380377e9 +117.03 151.94851663726993 -2.280200143226218e9 +117.035 151.92973155278065 -2.280581377743984e9 +117.04 151.910938308023 -2.2809626629385586e9 +117.045 151.89213689676996 -2.2813439988148193e9 +117.05 151.87332731278514 -2.2817253853776526e9 +117.055 151.85450954982366 -2.2821068226319427e9 +117.06 151.83568360163187 -2.2824883105825725e9 +117.065 151.8168494619472 -2.282869849234427e9 +117.07 151.79800712449858 -2.283251438592391e9 +117.075 151.7791565830056 -2.2836330786613517e9 +117.08 151.7602978311793 -2.2840147694461927e9 +117.085 151.74143086272184 -2.284396510951803e9 +117.09 151.72255567132655 -2.2847783031830697e9 +117.095 151.7036722506776 -2.285160146144878e9 +117.1 151.68478059445044 -2.285542039842119e9 +117.105 151.66588069631143 -2.285923984279681e9 +117.11 151.64697254991816 -2.2863059794624515e9 +117.115 151.62805614891894 -2.2866880253953214e9 +117.12 151.60913148695317 -2.2870701220831814e9 +117.125 151.59019855765152 -2.28745226953092e9 +117.13 151.57125735463504 -2.2878344677434306e9 +117.135 151.55230787151612 -2.288216716725605e9 +117.14 151.53335010189787 -2.288599016482333e9 +117.145 151.51438403937448 -2.28898136701851e9 +117.15 151.49540967753066 -2.2893637683390293e9 +117.155 151.4764270099424 -2.289746220448782e9 +117.16 151.4574360301761 -2.2901287233526635e9 +117.165 151.4384367317893 -2.290511277055571e9 +117.17 151.41942910833018 -2.290893881562395e9 +117.175 151.4004131533375 -2.2912765368780355e9 +117.18 151.38138886034102 -2.291659243007387e9 +117.185 151.36235622286108 -2.2920419999553466e9 +117.19 151.34331523440892 -2.2924248077268114e9 +117.195 151.3242658884861 -2.2928076663266788e9 +117.2 151.3052081785852 -2.293190575759848e9 +117.205 151.28614209818903 -2.2935735360312176e9 +117.21 151.2670676407716 -2.293956547145686e9 +117.215 151.24798479979682 -2.2943396091081557e9 +117.22 151.22889356871983 -2.294722721923523e9 +117.225 151.20979394098566 -2.2951058855966916e9 +117.23 151.19068591003045 -2.2954891001325626e9 +117.235 151.17156946928057 -2.2958723655360374e9 +117.24 151.1524446121529 -2.2962556818120174e9 +117.245 151.13331133205457 -2.2966390489654083e9 +117.25 151.11416962238386 -2.297022467001111e9 +117.255 151.09523585662083 -2.2974059359220657e9 +117.26 151.0760773257478 -2.2977894557155695e9 +117.265 151.05691028580887 -2.2981730264060955e9 +117.27 151.03773473007288 -2.298556647998557e9 +117.275 151.01898466159128 -2.2989403204732146e9 +117.28 150.99979211393634 -2.299324043841115e9 +117.285 150.9805909102141 -2.299707818125688e9 +117.29 150.96138104346954 -2.300091643331861e9 +117.295 150.94216250673773 -2.3004755194645576e9 +117.3 150.92293529304354 -2.3008594465287056e9 +117.305 150.90369939540085 -2.301243424529232e9 +117.31 150.88445480681392 -2.3016274534710636e9 +117.315 150.8652015202761 -2.302011533359129e9 +117.32 150.84593952877054 -2.302395664198357e9 +117.325 150.82666882526982 -2.302779845993678e9 +117.33 150.80738940273608 -2.3031640787500196e9 +117.335 150.78810125412116 -2.3035483624723125e9 +117.34 150.76880437236596 -2.3039326971654897e9 +117.345 150.74949875040133 -2.304317082834481e9 +117.35 150.7301843811473 -2.3047015194842167e9 +117.355 150.7108612575131 -2.3050860071196337e9 +117.36 150.69152937239775 -2.3054705457456603e9 +117.365 150.6721887186894 -2.305855135367233e9 +117.37 150.65283928926544 -2.3062397759892855e9 +117.375 150.63348107699272 -2.306624467616751e9 +117.38 150.61411407472747 -2.307009210254566e9 +117.385 150.594738275315 -2.3073940039076676e9 +117.39 150.57535367158948 -2.307778848580989e9 +117.395 150.55596025637536 -2.3081637442794685e9 +117.4 150.53655802248505 -2.3085486910080457e9 +117.405 150.51714696272074 -2.3089336887716546e9 +117.41 150.49772706987386 -2.309318737575236e9 +117.415 150.4782983367244 -2.309703837423729e9 +117.42 150.45886075604207 -2.310088988322073e9 +117.425 150.43941432058506 -2.3104741902752075e9 +117.43 150.41995902310077 -2.310859443288074e9 +117.435 150.400494856326 -2.311244747365613e9 +117.44 150.38102181298572 -2.3116301025127664e9 +117.445 150.36153988579446 -2.312015508734477e9 +117.45 150.3420490674554 -2.312400966035689e9 +117.455 150.32254935066086 -2.312786474421343e9 +117.46 150.3030407280915 -2.3131720338963847e9 +117.465 150.28352319241736 -2.31355764446576e9 +117.47 150.26399673629726 -2.3139433061344113e9 +117.475 150.2444613523781 -2.3143290189072857e9 +117.48 150.22491703329638 -2.314714782789329e9 +117.485 150.2053637716769 -2.315100597785489e9 +117.49 150.1858015601332 -2.3154864639007115e9 +117.495 150.16623039126742 -2.3158723811399465e9 +117.5 150.14665025767067 -2.31625834950814e9 +117.505 150.12706115192208 -2.3166443690102425e9 +117.51 150.10746306658993 -2.317030439651204e9 +117.515 150.08785599423086 -2.317416561435973e9 +117.52 150.0682399273898 -2.317802734369502e9 +117.525 150.04861485860056 -2.318188958456742e9 +117.53 150.02898078038515 -2.3185752337026443e9 +117.535 150.00933768525414 -2.3189615601121597e9 +117.54 149.98968556570657 -2.3193479376902447e9 +117.545 149.97002441422947 -2.319734366441851e9 +117.55 149.9503542232989 -2.320120846371931e9 +117.555 149.9306749853786 -2.320507377485443e9 +117.56 149.91098669292097 -2.320893959787339e9 +117.565 149.89128933836648 -2.321280593282576e9 +117.57 149.87158291414414 -2.3216672779761105e9 +117.575 149.85186741267088 -2.3220540138728995e9 +117.58 149.83214282635183 -2.3224408009779e9 +117.585 149.81240914758033 -2.3228276392960696e9 +117.59 149.79266636873788 -2.3232145288323693e9 +117.595 149.77291448219398 -2.323601469591756e9 +117.6 149.7531534803064 -2.323988461579189e9 +117.605 149.73338335542047 -2.324375504799631e9 +117.61 149.71360409987017 -2.324762599258041e9 +117.615 149.69381570597687 -2.3251497449593806e9 +117.62 149.6740181660501 -2.325536941908613e9 +117.625 149.6542114723874 -2.3259241901106997e9 +117.63 149.63439561727404 -2.326311489570604e9 +117.635 149.61457059298317 -2.326698840293291e9 +117.64 149.5947363917759 -2.327086242283722e9 +117.645 149.57489300590075 -2.327473695546865e9 +117.65 149.55504042759446 -2.3278612000876846e9 +117.655 149.53517864908108 -2.328248755911146e9 +117.66 149.5153076625727 -2.328636363022216e9 +117.665 149.49542746026856 -2.3290240214258633e9 +117.67 149.47553803435645 -2.3294117311270533e9 +117.675 149.45563937701064 -2.329799492130756e9 +117.68 149.43573148039374 -2.3301873044419403e9 +117.685 149.41581433665556 -2.3305751680655746e9 +117.69 149.3958879379335 -2.3309630830066295e9 +117.695 149.37595227635248 -2.3313510492700768e9 +117.7 149.35600734402456 -2.3317390668608866e9 +117.705 149.33605313304966 -2.332127135784031e9 +117.71 149.31608963551486 -2.3325152560444813e9 +117.715 149.29611684349425 -2.332903427647213e9 +117.72 149.27613474904985 -2.3332916505971975e9 +117.725 149.25614334423048 -2.3336799248994083e9 +117.73 149.23614262107213 -2.334068250558824e9 +117.735 149.2161325715985 -2.3344566275804157e9 +117.74 149.19611318782015 -2.334845055969161e9 +117.745 149.17608446173443 -2.3352335357300377e9 +117.75 149.1560463853265 -2.3356220668680205e9 +117.755 149.13599895056808 -2.336010649388088e9 +117.76 149.11594214941798 -2.3363992832952194e9 +117.765 149.0958759738223 -2.336787968594393e9 +117.77 149.07580041571373 -2.3371767052905865e9 +117.775 149.0557154670121 -2.3375654933887825e9 +117.78 149.0356211196241 -2.33795433289396e9 +117.785 149.0155173654433 -2.3383432238111e9 +117.79 148.99540419634985 -2.3387321661451874e9 +117.795 148.97528160421137 -2.3391211599011993e9 +117.8 148.95514958088125 -2.339510205084123e9 +117.805 148.93500811820047 -2.3398993016989403e9 +117.81 148.91485720799625 -2.3402884497506356e9 +117.815 148.8946968420826 -2.3406776492441936e9 +117.82 148.8745270122599 -2.3410669001845994e9 +117.825 148.85434771031552 -2.34145620257684e9 +117.83 148.83415892802302 -2.3418455564259005e9 +117.835 148.81396065714267 -2.3422349617367687e9 +117.84 148.79375288942097 -2.342624418514433e9 +117.845 148.7735356165913 -2.3430139267638803e9 +117.85 148.75330883037316 -2.343403486490101e9 +117.855 148.73307252247193 -2.343793097698084e9 +117.86 148.71282668458016 -2.344182760392818e9 +117.865 148.6925713083764 -2.344572474579295e9 +117.87 148.67230638552505 -2.344962240262508e9 +117.875 148.65203190767704 -2.3453520574474463e9 +117.88 148.63174786646974 -2.345741926139103e9 +117.885 148.61145425352595 -2.346131846342473e9 +117.89 148.5911510604554 -2.3465218180625477e9 +117.895 148.57083827885307 -2.3469118413043213e9 +117.9 148.55051590030055 -2.347301916072792e9 +117.905 148.53018391636516 -2.3476920423729515e9 +117.91 148.50984231860016 -2.348082220209798e9 +117.915 148.48949109854482 -2.3484724495883284e9 +117.92 148.46913024772414 -2.3488627305135384e9 +117.925 148.44875975764907 -2.349253062990427e9 +117.93 148.42837961981624 -2.3496434470239944e9 +117.935 148.40798982570814 -2.3500338826192374e9 +117.94 148.38759036679267 -2.350424369781156e9 +117.945 148.36718123452394 -2.3508149085147514e9 +117.95 148.34676242034104 -2.3512054988250256e9 +117.955 148.32633391566935 -2.351596140716977e9 +117.96 148.30589571191902 -2.351986834195611e9 +117.965 148.28544780048625 -2.352377579265931e9 +117.97 148.26499017275287 -2.352768375932936e9 +117.975 148.2445228200853 -2.3531592242016344e9 +117.98 148.22404573383622 -2.3535501240770297e9 +117.985 148.20355890534316 -2.353941075564126e9 +117.99 148.18332090000723 -2.3543320786580205e9 +117.995 148.16281461582406 -2.3547231333585186e9 +118. 148.14229849019523 -2.355114239685736e9 +118.005 148.12848122356962 -2.3555053974850197e9 +118.01 148.10846700842748 -2.355896606398082e9 +118.015 148.08792407535333 -2.3562878669448824e9 +118.02 148.0673708618629 -2.3566791791382394e9 +118.025 148.04680735834253 -2.3570705429832115e9 +118.03 148.02623355516224 -2.357461958484853e9 +118.035 148.0056494426745 -2.357853425648221e9 +118.04 147.98505501121483 -2.3582449444783773e9 +118.045 147.96445025110216 -2.3586365149803767e9 +118.05 147.94383515263775 -2.359028137159281e9 +118.055 147.92320970610606 -2.35941981102015e9 +118.06 147.902573901774 -2.3598115365680447e9 +118.065 147.8819277298917 -2.360203313808027e9 +118.07 147.86127118069146 -2.360595142745159e9 +118.075 147.8406042443885 -2.3609870233845043e9 +118.08 147.81992691118054 -2.3613789557311254e9 +118.085 147.79923917124796 -2.3617709397900877e9 +118.09 147.77854101475342 -2.362162975566457e9 +118.095 147.75783243184225 -2.362555063065296e9 +118.1 147.7371134126417 -2.362947202291675e9 +118.105 147.716383947262 -2.36333939325066e9 +118.11 147.69564402579525 -2.363731635947317e9 +118.115 147.6748936383156 -2.364123930386717e9 +118.12 147.65413277487977 -2.364516276573929e9 +118.125 147.6333614255264 -2.3649086745140214e9 +118.13 147.61257958027616 -2.3653011242120657e9 +118.135 147.59178722913185 -2.3656936256731343e9 +118.14 147.57098436207804 -2.366086178902298e9 +118.145 147.55017096908148 -2.3664787839046297e9 +118.15 147.52934704009033 -2.366871440685204e9 +118.155 147.50851256503486 -2.3672641492490935e9 +118.16 147.48766753382725 -2.367656909601373e9 +118.165 147.46681193636067 -2.3680497217471213e9 +118.17 147.44594576251083 -2.368442585691411e9 +118.175 147.4250690021342 -2.36883550143932e9 +118.18 147.40418164506903 -2.369228468995928e9 +118.185 147.38328368113542 -2.3696214883663116e9 +118.19 147.3623751001343 -2.370014559555549e9 +118.195 147.34145589184826 -2.3704076825687222e9 +118.2 147.32052604604084 -2.3708008574109116e9 +118.205 147.2995855524574 -2.3711940840871973e9 +118.21 147.27863440082396 -2.371587362602662e9 +118.215 147.25767258084772 -2.371980692962389e9 +118.22 147.2367000822172 -2.372374075171459e9 +118.225 147.2157168946017 -2.3727675092349586e9 +118.23 147.19472300765133 -2.373160995157974e9 +118.235 147.1737184109974 -2.3735545329455867e9 +118.24 147.15270309425165 -2.373948122602886e9 +118.245 147.13167704700697 -2.374341764134959e9 +118.25 147.1106402588369 -2.3747354575468917e9 +118.255 147.08959271929524 -2.375129202843773e9 +118.26 147.06853441791668 -2.3755230000306935e9 +118.265 147.0474653442164 -2.3759168491127415e9 +118.27 147.02638548769002 -2.376310750095008e9 +118.275 147.00529483781344 -2.3767047029825854e9 +118.28 146.98419338404304 -2.3770987077805643e9 +118.285 146.96308111581536 -2.377492764494038e9 +118.29 146.94195802254714 -2.3778868731281013e9 +118.295 146.9208240936353 -2.378281033687846e9 +118.3 146.89967931845695 -2.3786752461783686e9 +118.305 146.87852368636916 -2.379069510604766e9 +118.31 146.85735718670864 -2.3794638269721317e9 +118.315 146.83617980879254 -2.3798581952855654e9 +118.32 146.81499154191746 -2.380252615550163e9 +118.325 146.79379237535966 -2.3806470877710257e9 +118.33 146.77258229837557 -2.3810416119532504e9 +118.335 146.75136130020078 -2.3814361881019382e9 +118.34 146.73012937005055 -2.3818308162221913e9 +118.345 146.70888649711992 -2.3822254963191094e9 +118.35 146.6876326705831 -2.3826202283977947e9 +118.355 146.66636787959342 -2.3830150124633527e9 +118.36 146.64509211328433 -2.3834098485208845e9 +118.365 146.6238053607676 -2.3838047365754957e9 +118.37 146.60300933787576 -2.3841996766043205e9 +118.375 146.5817008301847 -2.384594668621211e9 +118.38 146.5603813026563 -2.3849897126504765e9 +118.385 146.53905074431765 -2.3853848086972265e9 +118.39 146.51770914417403 -2.385779956766567e9 +118.395 146.49635649121046 -2.38617515686361e9 +118.4 146.4749927743898 -2.3865704089934635e9 +118.405 146.45361798265398 -2.3869657131612387e9 +118.41 146.4322321049237 -2.3873610693720455e9 +118.415 146.41083513009798 -2.3877564776309996e9 +118.42 146.38942704705417 -2.3881519379432106e9 +118.425 146.36800784464842 -2.388547450313793e9 +118.43 146.3465775117147 -2.3889430147478623e9 +118.435 146.3251360370657 -2.389338631250532e9 +118.44 146.30368340949195 -2.389734299826919e9 +118.445 146.28221961776222 -2.39013002048214e9 +118.45 146.26074465062302 -2.3905257932213135e9 +118.455 146.23925849679952 -2.390921618049555e9 +118.46 146.21776114499394 -2.3913174949719853e9 +118.465 146.19625258388677 -2.391713423993725e9 +118.47 146.17473280213602 -2.392109405119893e9 +118.475 146.1532017883776 -2.392505438355611e9 +118.48 146.13165953122473 -2.3929015237060013e9 +118.485 146.1101060192683 -2.3932976611761856e9 +118.49 146.09042756111273 -2.3936938507502666e9 +118.495 146.06885243366528 -2.3940900923310513e9 +118.5 146.04726597137346 -2.39448638604693e9 +118.505 146.02566816264104 -2.394882731903034e9 +118.51 146.0040589958485 -2.395279129904495e9 +118.515 145.98243845935397 -2.39567558005644e9 +118.52 145.96080654149154 -2.3960720823640037e9 +118.525 145.93916323057198 -2.3964686368323193e9 +118.53 145.91750851488285 -2.3968652434665174e9 +118.535 145.8958423826881 -2.397261902271734e9 +118.54 145.874164822228 -2.397658613253104e9 +118.545 145.852475821719 -2.3980553764157624e9 +118.55 145.8307753693539 -2.3984521917648454e9 +118.555 145.80906345330172 -2.398849059305492e9 +118.56 145.78734006170723 -2.399245979042838e9 +118.565 145.76560518269147 -2.3996429509820232e9 +118.57 145.74385880435108 -2.400039975128187e9 +118.575 145.72210091475873 -2.400437051486472e9 +118.58 145.7003315019626 -2.4008341800620165e9 +118.585 145.6785505539865 -2.401231360859963e9 +118.59 145.65675805882958 -2.4016285938854566e9 +118.595 145.6349540044671 -2.402025879143639e9 +118.6 145.61313837884902 -2.4024232166396537e9 +118.605 145.5913111699006 -2.4028206063786497e9 +118.61 145.56947236552264 -2.403218048365769e9 +118.615 145.54762195359066 -2.403615542606159e9 +118.62 145.52575992195526 -2.404013089104971e9 +118.625 145.50388625844215 -2.4044106878673496e9 +118.63 145.4820009508516 -2.404808338898445e9 +118.635 145.46010398695864 -2.4052060422034087e9 +118.64 145.438195354513 -2.4056037977873907e9 +118.645 145.4162750412389 -2.406001605655542e9 +118.65 145.394343034835 -2.4063994658130164e9 +118.655 145.37239932297427 -2.406797378264965e9 +118.66 145.35044389330398 -2.407195343016545e9 +118.665 145.32847673344534 -2.40759336007291e9 +118.67 145.30649783099412 -2.407991429439215e9 +118.675 145.2845071735195 -2.408389551120618e9 +118.68 145.26250474856482 -2.4087877251222754e9 +118.685 145.24049054364707 -2.4091859514493465e9 +118.69 145.21846454625705 -2.409584230106989e9 +118.695 145.196426743859 -2.4099825611003633e9 +118.7 145.17437712389045 -2.4103809444346313e9 +118.705 145.15231567376279 -2.4107793801149535e9 +118.71 145.13024238086038 -2.411177868146492e9 +118.715 145.10846959764874 -2.4115764085172415e9 +118.72 145.08637264545777 -2.4119750012373657e9 +118.725 145.06426372088572 -2.4123736463241987e9 +118.73 145.04276928595783 -2.4127723437530365e9 +118.735 145.02063652383447 -2.413171093530008e9 +118.74 144.9984915662449 -2.4135698956892104e9 +118.745 144.97633439982562 -2.4139687502358403e9 +118.75 144.95416501118348 -2.4143676571750903e9 +118.755 144.93198338689672 -2.414766616512158e9 +118.76 144.909789513514 -2.4151656282522397e9 +118.765 144.88758337755513 -2.4155646924005327e9 +118.77 144.86536496550946 -2.4159638089622364e9 +118.775 144.84313426383747 -2.416362977942551e9 +118.78 144.82089125896988 -2.416762199346676e9 +118.785 144.79863593730698 -2.417161473179811e9 +118.79 144.7763682852199 -2.4175607994471617e9 +118.795 144.75408828904904 -2.417960178153928e9 +118.8 144.73179593510474 -2.418359609305315e9 +118.805 144.70949120966722 -2.41875909290653e9 +118.81 144.68717409898628 -2.4191586289627743e9 +118.815 144.66484458928068 -2.419558217479257e9 +118.82 144.6425026667391 -2.4199578584611864e9 +118.825 144.62014831751873 -2.4203575519137697e9 +118.83 144.5977815277465 -2.4207572978422174e9 +118.835 144.57540228351817 -2.4211570962517385e9 +118.84 144.55301057089792 -2.4215569471475453e9 +118.845 144.5306063759187 -2.4219568505348487e9 +118.85 144.50818968458245 -2.4223568064188623e9 +118.855 144.48576048285895 -2.422756814804802e9 +118.86 144.46331875668702 -2.423156875697879e9 +118.865 144.44086449197283 -2.4235569891033115e9 +118.87 144.41839767459115 -2.4239571550263166e9 +118.875 144.39591829038451 -2.42435737347211e9 +118.88 144.3734263251633 -2.424757644445911e9 +118.885 144.35092176470548 -2.4251579679529395e9 +118.89 144.3494050206328 -2.425558343288632e9 +118.895 144.3554757332677 -2.425958768629197e9 +118.9 144.361546445902 -2.4263592438861246e9 +118.905 144.34362438564003 -2.4267597699903e9 +118.91 144.3211012559033 -2.4271603486161575e9 +118.915 144.29856518506358 -2.42756097980285e9 +118.92 144.27601615812037 -2.4279616635556264e9 +118.925 144.25345416003768 -2.4283623998797407e9 +118.93 144.23087917574475 -2.428763188780448e9 +118.935 144.20829119013592 -2.4291640302630005e9 +118.94 144.18569018806983 -2.429564924332655e9 +118.945 144.16307615437003 -2.4299658709946685e9 +118.95 144.1404490738244 -2.430366870254299e9 +118.955 144.1178089311853 -2.4307679221168036e9 +118.96 144.0951557111686 -2.4311690265874434e9 +118.965 144.07248939845496 -2.4315701836714783e9 +118.97 144.04980997768806 -2.43197139337417e9 +118.975 144.02711743347595 -2.432372655700781e9 +118.98 144.0044117503896 -2.432773970656576e9 +118.985 143.98169291296395 -2.433175338246818e9 +118.99 143.95896090569653 -2.4335767584767723e9 +118.995 143.93621571304826 -2.433978231351709e9 +119. 143.91345731944284 -2.4343797568768916e9 +119.005 143.8906857092665 -2.4347813350575905e9 +119.01 143.86790086686833 -2.435182965899076e9 +119.015 143.8451027765596 -2.435584649406617e9 +119.02 143.8222914226141 -2.4359863855854874e9 +119.025 143.7994667892671 -2.436388174440959e9 +119.03 143.77662886071627 -2.436790015978304e9 +119.035 143.7537776211208 -2.4371919102027984e9 +119.04 143.73091305460127 -2.437593857119719e9 +119.045 143.70803514524022 -2.43799585673434e9 +119.05 143.68514387708063 -2.438397909051941e9 +119.055 143.66223923412687 -2.4388000140778017e9 +119.06 143.6393212003443 -2.439202171817199e9 +119.065 143.61638975965883 -2.439604382275416e9 +119.07 143.59344489595688 -2.4400066454577336e9 +119.075 143.57048659308495 -2.4404089613694367e9 +119.08 143.54751483485 -2.4408113300158067e9 +119.085 143.52452960501904 -2.44121375140213e9 +119.09 143.50153088731818 -2.4416162255336943e9 +119.095 143.4785186654343 -2.442018752415783e9 +119.1 143.4554929230126 -2.4424213320536866e9 +119.105 143.43245364365768 -2.4428239644526944e9 +119.11 143.40940081093373 -2.4432266496180954e9 +119.115 143.38633440836358 -2.4436293875551815e9 +119.12 143.36325441942813 -2.4440321782692466e9 +119.125 143.34016082756733 -2.4444350217655816e9 +119.13 143.3170536161795 -2.4448379180494823e9 +119.135 143.29393276862024 -2.445240867126245e9 +119.14 143.27079826820415 -2.4456438690011644e9 +119.145 143.24765009820246 -2.4460469236795406e9 +119.15 143.22448824184434 -2.446450031166671e9 +119.155 143.20131268231643 -2.446853191467854e9 +119.16 143.1784270969352 -2.4472564045875463e9 +119.165 143.15522424464848 -2.447659670505101e9 +119.17 143.13200763783317 -2.448062989252601e9 +119.175 143.1087772595011 -2.448466360835353e9 +119.18 143.0855330926207 -2.4488697852586613e9 +119.185 143.06227512011645 -2.449273262527831e9 +119.19 143.03900332486853 -2.4496767926481705e9 +119.195 143.0157176897127 -2.450080375624989e9 +119.2 142.99241819743997 -2.450484011463597e9 +119.205 142.96910483079688 -2.450887700169302e9 +119.21 142.94577757248464 -2.451291441747418e9 +119.215 142.9224364051589 -2.4516952362032585e9 +119.22 142.89908131143048 -2.452099083542136e9 +119.225 142.87571227386385 -2.4525029837693663e9 +119.23 142.85232927497785 -2.452906936890266e9 +119.235 142.82893229724493 -2.4533109429101515e9 +119.24 142.80552132309117 -2.453715001834342e9 +119.245 142.7820963348958 -2.4541191136681585e9 +119.25 142.75865731499167 -2.454523278416918e9 +119.255 142.73520424566428 -2.4549274960859447e9 +119.26 142.71173710915116 -2.4553317666805625e9 +119.265 142.6882558876432 -2.455736090206093e9 +119.27 142.66476056328264 -2.456140466667863e9 +119.275 142.641251118164 -2.4565448960711994e9 +119.28 142.61772753433317 -2.456949378421427e9 +119.285 142.5941897937879 -2.457353913723877e9 +119.29 142.57063787847648 -2.457758501983879e9 +119.295 142.54707177029883 -2.458163143206761e9 +119.3 142.52349145110458 -2.4585678373978577e9 +119.305 142.4998969026945 -2.458972584562503e9 +119.31 142.47628810681917 -2.459377384706028e9 +119.315 142.4526650451791 -2.4597822378337703e9 +119.32 142.42902769942415 -2.460187143951066e9 +119.325 142.40537605115364 -2.460592103063254e9 +119.33 142.38171008191622 -2.4609971151756716e9 +119.335 142.35802977320878 -2.4614021802936583e9 +119.34 142.33433510647728 -2.4618072984225583e9 +119.345 142.31062606311528 -2.4622124695677114e9 +119.35 142.2869026244648 -2.462617693734461e9 +119.355 142.2631647718153 -2.4630229709281545e9 +119.36 142.2394124864036 -2.4634283011541348e9 +119.365 142.21564574941345 -2.4638336844177504e9 +119.37 142.19186454197572 -2.464239120724351e9 +119.375 142.16806884516777 -2.4646446100792828e9 +119.38 142.1442586400129 -2.4650501524878983e9 +119.385 142.12043390748016 -2.46545574795555e9 +119.39 142.09659462848506 -2.46586139648759e9 +119.395 142.0727407838875 -2.4662670980893717e9 +119.4 142.04887235449257 -2.466672852766253e9 +119.405 142.0249893210506 -2.467078660523588e9 +119.41 142.00109166425557 -2.4674845213667355e9 +119.415 141.97717936474575 -2.4678904353010564e9 +119.42 141.9532524031036 -2.4682964023319073e9 +119.425 141.92931075985433 -2.4687024224646516e9 +119.43 141.9053544154665 -2.4691084957046537e9 +119.435 141.88176537217748 -2.469514622050731e9 +119.44 141.85777971441544 -2.4699208014865704e9 +119.445 141.83377917915186 -2.470327034045755e9 +119.45 141.8105300740311 -2.4707333197094574e9 +119.455 141.78649998721323 -2.4711396584617796e9 +119.46 141.7624547261434 -2.4715460503535786e9 +119.465 141.73839427002505 -2.4719524953902564e9 +119.47 141.71431859799927 -2.472358993577218e9 +119.475 141.6902276891444 -2.47276554491987e9 +119.48 141.66612152247512 -2.47317214942362e9 +119.485 141.64200007694328 -2.473578807093878e9 +119.49 141.6178633314363 -2.4739855179360504e9 +119.495 141.59371126477723 -2.474392281955553e9 +119.5 141.5695438557242 -2.4747990991577954e9 +119.505 141.54536108297083 -2.475205969548193e9 +119.51 141.52116292514455 -2.4756128931321616e9 +119.515 141.4969493608072 -2.4760198699151173e9 +119.52 141.47272036845428 -2.476426899902478e9 +119.525 141.44847592651442 -2.4768339830996647e9 +119.53 141.42421601334934 -2.477241119512097e9 +119.535 141.399940607253 -2.4776483091451955e9 +119.54 141.37564968645117 -2.4780555520043874e9 +119.545 141.35134322910193 -2.478462848095094e9 +119.55 141.32702121329353 -2.478870197422743e9 +119.555 141.30268361704586 -2.4792775999927626e9 +119.56 141.2783304183086 -2.4796850558105803e9 +119.565 141.25396159496123 -2.480092564881627e9 +119.57 141.2295771248131 -2.4805001272113357e9 +119.575 141.20517698560187 -2.4809077428051386e9 +119.58 141.18076115499443 -2.4813154116684694e9 +119.585 141.15632961058512 -2.4817231338067646e9 +119.59 141.13188232989597 -2.482130909225462e9 +119.595 141.10741929037638 -2.4825387379299994e9 +119.6 141.08294046940205 -2.4829466199258165e9 +119.605 141.05844584427516 -2.483354555218356e9 +119.61 141.03393539222307 -2.48376254381306e9 +119.615 141.00940909039895 -2.4841705857153726e9 +119.62 140.98486691587993 -2.4845786809307404e9 +119.625 140.96030884566778 -2.4849868294646096e9 +119.63 140.93573485668793 -2.4853950313224287e9 +119.635 140.91114492578862 -2.4858032865096493e9 +119.64 140.88653902974116 -2.4862115950317206e9 +119.645 140.86191714523852 -2.4866199568940964e9 +119.65 140.83727924889558 -2.4870283721022325e9 +119.655 140.81262531724803 -2.4874368406615815e9 +119.66 140.7879553267521 -2.487845362577602e9 +119.665 140.76326925378424 -2.488253937855755e9 +119.67 140.73856707463992 -2.488662566501497e9 +119.675 140.71384876553344 -2.4890712485202913e9 +119.68 140.6891143025976 -2.4894799839176016e9 +119.685 140.6643636618828 -2.4898887726988916e9 +119.69 140.63959681935657 -2.490297614869626e9 +119.695 140.61481375090287 -2.490706510435274e9 +119.7 140.5900144323212 -2.4911154594013057e9 +119.705 140.56519883932734 -2.4915244617731895e9 +119.71 140.54036694755084 -2.4919335175563974e9 +119.715 140.51551873253575 -2.4923426267564054e9 +119.72 140.49065416973983 -2.492751789378685e9 +119.725 140.46577323453297 -2.493161005428715e9 +119.73 140.44087590219803 -2.4935702749119735e9 +119.735 140.4159621479289 -2.4939795978339376e9 +119.74 140.3910319468305 -2.4943889742000914e9 +119.745 140.3660852739181 -2.494798404015917e9 +119.75 140.34112210411655 -2.4952078872868967e9 +119.755 140.3161424122593 -2.4956174240185175e9 +119.76 140.29114617308824 -2.4960270142162676e9 +119.765 140.2661333612528 -2.496436657885634e9 +119.77 140.2411039513091 -2.4968463550321074e9 +119.775 140.21605791771927 -2.497256105661182e9 +119.78 140.19099523485102 -2.497665909778348e9 +119.785 140.1659158769766 -2.498075767389103e9 +119.79 140.14081981827198 -2.4984856784989424e9 +119.795 140.1157070328167 -2.498895643113364e9 +119.8 140.09057749459222 -2.4993056612378693e9 +119.805 140.06543117748186 -2.49971573287796e9 +119.81 140.04026805526993 -2.500125858039137e9 +119.815 140.01508810164046 -2.500536036726906e9 +119.82 139.98989129017696 -2.500946268946773e9 +119.825 139.96467759436115 -2.501356554704249e9 +119.83 139.93944698757264 -2.501766894004839e9 +119.835 139.9141994430879 -2.502177286854056e9 +119.84 139.88893493407897 -2.5025877332574143e9 +119.845 139.8636534336134 -2.5029982332204256e9 +119.85 139.83835491465265 -2.503408786748608e9 +119.855 139.81303935005172 -2.50381939384748e9 +119.86 139.7877067125582 -2.504230054522558e9 +119.865 139.7623569748109 -2.5046407687793655e9 +119.87 139.73699010933956 -2.505051536623427e9 +119.875 139.71160608856366 -2.505462358060263e9 +119.88 139.68620488479147 -2.505873233095402e9 +119.885 139.660786470219 -2.506284161734372e9 +119.89 139.6353508169293 -2.506695143982701e9 +119.895 139.6098978968914 -2.5071061798459215e9 +119.9 139.58442768195877 -2.5075172693295674e9 +119.905 139.5589401438695 -2.507928412439172e9 +119.91 139.53343525424413 -2.5083396091802707e9 +119.915 139.507912984585 -2.508750859558406e9 +119.92 139.4823733062759 -2.5091621635791135e9 +119.925 139.45681619057964 -2.5095735212479362e9 +119.93 139.43124160863803 -2.5099849325704203e9 +119.935 139.40564953147086 -2.510396397552106e9 +119.94 139.39148251659455 -2.510807915991768e9 +119.945 139.3658627135433 -2.51121948730433e9 +119.95 139.34022483685553 -2.5116311122922015e9 +119.955 139.31456885569523 -2.5120427909609785e9 +119.96 139.2888947390933 -2.51245452331626e9 +119.965 139.26320245594596 -2.512866309363644e9 +119.97 139.23749197501368 -2.513278149108733e9 +119.975 139.21176326491957 -2.51369004255713e9 +119.98 139.186016294148 -2.5141019897144427e9 +119.985 139.16025103104434 -2.514513990586274e9 +119.99 139.1344674438123 -2.5149260451782374e9 +119.995 139.10866550051307 -2.5153381534959426e9 +120. 139.0828451690646 -2.5157503155450025e9 +120.005 139.0570064172393 -2.5161625313310328e9 +120.01 139.03114921266285 -2.516574800859651e9 +120.015 139.00527352281355 -2.516987124136476e9 +120.02 138.9793793150196 -2.5173995011671286e9 +120.025 138.95346655645855 -2.517811931957233e9 +120.03 138.9275352141557 -2.518224416512414e9 +120.035 138.90158525498217 -2.5186369548382983e9 +120.04 138.8756166456534 -2.5190495469405165e9 +120.045 138.84962935272836 -2.5194621928246984e9 +120.05 138.8236233426072 -2.519874892496478e9 +120.055 138.79759858152926 -2.520287645961493e9 +120.06 138.77155503557273 -2.520700453225376e9 +120.065 138.74549267065177 -2.5211133142937713e9 +120.07 138.71941145251546 -2.5215262291723185e9 +120.075 138.6933113467458 -2.521939197866663e9 +120.08 138.6671923187559 -2.522352220382448e9 +120.08500000000001 138.64105433378862 -2.5227652967253256e9 +120.09 138.61489735691433 -2.5231784269009414e9 +120.095 138.58872135302903 -2.523591610914951e9 +120.1 138.56252628685291 -2.524004848773007e9 +120.105 138.53631212292785 -2.524418140480769e9 +120.11 138.51007882561612 -2.524831486043893e9 +120.115 138.48382635909795 -2.525244885468041e9 +120.12 138.45755468736945 -2.5256583387588773e9 +120.125 138.43173810920703 -2.5260718459135284e9 +120.13 138.40542814673083 -2.526485406913012e9 +120.135 138.37909871445558 -2.5268990217961783e9 +120.14 138.35370156798982 -2.5273126905175104e9 +120.145 138.3273334232208 -2.527726413101439e9 +120.15 138.30094538295103 -2.528140189586107e9 +120.155 138.2745374084031 -2.5285540199772315e9 +120.16 138.2481094605916 -2.5289679042805376e9 +120.165 138.22166150032075 -2.5293818425017524e9 +120.17 138.19519348818224 -2.529795834646598e9 +120.175 138.16870538455152 -2.530209880720809e9 +120.18 138.1421971495866 -2.530623980730118e9 +120.185 138.11566874322514 -2.531038134680258e9 +120.19 138.08912012518124 -2.5314523425769663e9 +120.195 138.06255125494337 -2.5318666044259844e9 +120.2 138.03596209177107 -2.5322809202330546e9 +120.205 138.0093525946927 -2.53269529000392e9 +120.21000000000001 137.982722722502 -2.5331097137443323e9 +120.215 137.956072433756 -2.5335241914600363e9 +120.22 137.9294016867711 -2.5339387231567874e9 +120.225 137.90271043962082 -2.5343533088403406e9 +120.23 137.875998650132 -2.5347679485164566e9 +120.235 137.8492662758827 -2.5351826421908903e9 +120.24 137.82251327419775 -2.535597389869406e9 +120.245 137.7957396021461 -2.5360121915577745e9 +120.25 137.76894521653807 -2.5364270472617583e9 +120.255 137.74213007392058 -2.53684195698713e9 +120.26 137.71529413057488 -2.537256920739666e9 +120.265 137.68843734251237 -2.537671938525139e9 +120.27 137.66155966547154 -2.5380870103493295e9 +120.275 137.63466105491338 -2.5385021362180214e9 +120.28 137.6077414660184 -2.5389173161369963e9 +120.285 137.58080085368266 -2.539332550112043e9 +120.29 137.55383917251348 -2.539747838148952e9 +120.295 137.5268563768259 -2.5401631802535152e9 +120.3 137.49985242063795 -2.5405785764315305e9 +120.305 137.4728272576674 -2.5409940266887946e9 +120.31 137.44578084132627 -2.5414095310311093e9 +120.315 137.41871312471778 -2.5418250894642806e9 +120.32 137.39162406063076 -2.542240701994114e9 +120.325 137.36451360153572 -2.542656368626421e9 +120.33 137.33738169958013 -2.5430720893670154e9 +120.33500000000001 137.31022830658318 -2.5434878642217126e9 +120.34 137.28305337403168 -2.5439036931963315e9 +120.345 137.25585685307453 -2.544319576296694e9 +120.35 137.22863869451763 -2.544735513528626e9 +120.355 137.2013988488185 -2.545151504897957e9 +120.36 137.17413726608194 -2.545567550410517e9 +120.365 137.14685389605333 -2.5459836500721397e9 +120.37 137.1195486881133 -2.5463998038886666e9 +120.375 137.09222159127296 -2.546816011865934e9 +120.38 137.06487255416684 -2.547232274009787e9 +120.385 137.0375015250472 -2.5476485903260756e9 +120.39 137.01010845177876 -2.5480649608206463e9 +120.395 136.98269328183093 -2.548481385499355e9 +120.4 136.9552559622726 -2.548897864368058e9 +120.405 136.92779643976488 -2.5493143974326153e9 +120.41 136.90031466055487 -2.5497309846988897e9 +120.415 136.87281057046775 -2.5501476261727514e9 +120.42 136.84528411490078 -2.550564321860067e9 +120.425 136.81773523881543 -2.550981071766711e9 +120.43 136.79016388672986 -2.551397875898562e9 +120.435 136.76257000271139 -2.5518147342614985e9 +120.44 136.73495353036887 -2.5522316468614063e9 +120.445 136.70731441284397 -2.5526486137041726e9 +120.45 136.67965259280345 -2.553065634795688e9 +120.455 136.65196801243056 -2.5534827101418476e9 +120.46000000000001 136.62426061341623 -2.5538998397485495e9 +120.465 136.59653033694977 -2.5543170236216955e9 +120.47 136.56877712371065 -2.554734261767191e9 +120.475 136.54100091385757 -2.555151554190947e9 +120.48 136.51320164702022 -2.5555689008988757e9 +120.485 136.48537926228832 -2.5559863018968935e9 +120.49 136.4575336982014 -2.556403757190922e9 +120.495 136.4296648927392 -2.5568212667868853e9 +120.5 136.40177278330972 -2.557238830690711e9 +120.505 136.3738573067381 -2.5576564489083333e9 +120.51 136.3459183992562 -2.5580741214456887e9 +120.515 136.31795599648962 -2.558491848308716e9 +120.52 136.28997003344608 -2.55890962950336e9 +120.525 136.26196044450253 -2.559327465035571e9 +120.53 136.23392716339333 -2.559745354911299e9 +120.535 136.2058701231952 -2.5601632991365023e9 +120.54 136.17778925631526 -2.5605812977171435e9 +120.545 136.1496844944755 -2.5609993506591854e9 +120.55 136.12155576869978 -2.5614174579685984e9 +120.555 136.09340300929733 -2.5618356196513577e9 +120.56 136.0652261458479 -2.56225383571344e9 +120.565 136.0370251071865 -2.5626721061608286e9 +120.57 136.00879982138596 -2.5630904309995117e9 +120.575 135.98055021574032 -2.5635088102354813e9 +120.58 135.95227621674744 -2.563927243874732e9 +120.58500000000001 135.92397775009073 -2.564345731923269e9 +120.59 135.89565474062084 -2.5647642743870935e9 +120.595 135.8673071123357 -2.565182871272218e9 +120.6 135.83893478836117 -2.5656015225846586e9 +120.605 135.81053769093018 -2.5660202283304367e9 +120.61 135.78211574136117 -2.5664389885155754e9 +120.615 135.75366886003647 -2.566857803146106e9 +120.62 135.7251969663793 -2.567276672228064e9 +120.625 135.69669997883008 -2.5676955957674894e9 +120.63 135.66817781482186 -2.5681145737704277e9 +120.635 135.63963039075523 -2.568533606242933e9 +120.64 135.61105762197184 -2.568952693191057e9 +120.645 135.58245942272725 -2.569371834620865e9 +120.65 135.55383570616314 -2.5697910305384226e9 +120.655 135.5251863842774 -2.570210280949802e9 +120.66 135.49651136789373 -2.570629585861083e9 +120.665 135.46781056663067 -2.571048945278351e9 +120.67 135.4390838888691 -2.5714683592076926e9 +120.675 135.41033124171724 -2.5718878276552052e9 +120.68 135.3815525309759 -2.572307350626992e9 +120.685 135.35274766110243 -2.57272692812916e9 +120.69 135.32391653517098 -2.5731465601678214e9 +120.695 135.29505905483452 -2.5735662467490983e9 +120.7 135.26617512028213 -2.573985987879118e9 +120.705 135.23726463019707 -2.5744057835640116e9 +120.71000000000001 135.20832748171082 -2.5748256338099213e9 +120.715 135.17936357035776 -2.57524553862299e9 +120.72 135.15037279002533 -2.575665498009373e9 +120.725 135.1213550329035 -2.5760855119752293e9 +120.73 135.09231018943197 -2.5765055805267277e9 +120.735 135.06323814824495 -2.576925703670039e9 +120.74 135.03413879611296 -2.5773458814113464e9 +120.745 135.0050120178828 -2.5777661137568398e9 +120.75 134.97585769641407 -2.5781864007127113e9 +120.755 134.94667571251318 -2.5786067422851686e9 +120.76 134.91746594486452 -2.5790271384804215e9 +120.765 134.88822826995766 -2.5794475893046885e9 +120.77 134.8589625620113 -2.5798680947641983e9 +120.775 134.82966869289407 -2.5802886548651876e9 +120.78 134.80034653204103 -2.580709269613898e9 +120.785 134.77099594636564 -2.581129939016584e9 +120.79 134.74222006914792 -2.581550663035261e9 +120.795 134.71281250336722 -2.581971441713581e9 +120.8 134.68458627548443 -2.582392275008989e9 +120.805 134.65512117198412 -2.582813162936696e9 +120.81 134.62562628351824 -2.5832341055497775e9 +120.815 134.5961014570205 -2.5836551028545985e9 +120.82 134.5665465361208 -2.5840761548575335e9 +120.825 134.53696136101252 -2.584497261564966e9 +120.83 134.51101154407942 -2.584918422754498e9 +120.83500000000001 134.48136889310646 -2.58533963863054e9 +120.84 134.45169538412458 -2.5857609092300563e9 +120.845 134.4219908419781 -2.5861822345594835e9 +120.85 134.39225508730019 -2.586603614625267e9 +120.855 134.3624879363259 -2.5870250494338694e9 +120.86 134.33268920069585 -2.5874465389917583e9 +120.865 134.30285868724604 -2.587868083305418e9 +120.87 134.2729961977842 -2.5882896823813477e9 +120.875 134.24310152885428 -2.588711336226053e9 +120.88 134.21317447148206 -2.5891330448460603e9 +120.885 134.1832148109058 -2.5895548082479067e9 +120.89 134.15322232628927 -2.5899766264381437e9 +120.895 134.12319679041272 -2.590398499423339e9 +120.9 134.09313796934433 -2.5908204272100754e9 +120.905 134.06304562208751 -2.591242409804947e9 +120.91 134.03291950020133 -2.591664447214573e9 +120.915 134.00275934739508 -2.592086539445583e9 +120.92 133.97256489909012 -2.5925086865046234e9 +120.925 133.94233588194948 -2.592930888398363e9 +120.93 133.91207201336917 -2.5933531451334863e9 +120.935 133.88177300093028 -2.593775456716697e9 +120.94 133.85143854180495 -2.59419782315472e9 +120.945 133.82106832211295 -2.5946202444543e9 +120.95 133.79066201622396 -2.595042720622204e9 +120.955 133.76021928599846 -2.5954652516652193e9 +120.96000000000001 133.72973977996102 -2.5958878375901594e9 +120.965 133.69922313239854 -2.596310478403859e9 +120.97 133.66866896237286 -2.596733174113179e9 +120.975 133.63807687264136 -2.5971559247250094e9 +120.98 133.6074464484694 -2.5975787302462626e9 +120.985 133.5767772563243 -2.5980015906838837e9 +120.99 133.5469365940403 -2.5984245060167565e9 +120.995 133.51618958466446 -2.598847476222184e9 +121. 133.48540239172502 -2.599270501364915e9 +121.005 133.45457449120153 -2.5996935814520206e9 +121.01 133.4237053313866 -2.600116716490612e9 +121.015 133.39279433044538 -2.600539906487834e9 +121.02 133.3618408736758 -2.6009631514508743e9 +121.025 133.33084431042352 -2.601386451386966e9 +121.03 133.29980395059798 -2.6018098063033834e9 +121.035 133.26871906071898 -2.6022332162074523e9 +121.04 133.23758885941245 -2.602656681106552e9 +121.045 133.20641251226078 -2.6030802010081124e9 +121.05 133.17518912587923 -2.6035037759196253e9 +121.055 133.14391774107506 -2.603927405848647e9 +121.06 133.11259732490169 -2.6043510908027997e9 +121.065 133.08122676137307 -2.6047748307897806e9 +121.07 133.04980484054738 -2.605198625817365e9 +121.075 133.0183302456022 -2.60562247589342e9 +121.08 132.98680153741986 -2.606046381025902e9 +121.08500000000001 132.9552171360501 -2.6064703412228746e9 +121.09 132.9235752982198 -2.606894356492512e9 +121.095 132.8918740897725 -2.6073184268431206e9 +121.1 132.86011135153117 -2.607742552283144e9 +121.105 132.8282846564892 -2.608166732821187e9 +121.11 132.79639125539745 -2.6085909684660296e9 +121.115 132.7644280065238 -2.609015259226657e9 +121.12 132.7323912833845 -2.609439605112291e9 +121.125 132.70027685107578 -2.609864006132419e9 +121.13 132.66807969660695 -2.6102884622968535e9 +121.135 132.63579378965017 -2.6107129736157875e9 +121.14 132.60341173394713 -2.6111375400998755e9 +121.145 132.57092423879376 -2.611562161760349e9 +121.15 132.53831927714126 -2.6119868386091785e9 +121.155 132.50558065696313 -2.6124115706592984e9 +121.16 132.47268538427744 -2.6128363579249907e9 +121.165 132.43959818477788 -2.6132612004225216e9 +121.17 132.40625785590254 -2.6136860981713862e9 +121.175 132.37252993083334 -2.6141110511973896e9 +121.18 132.33765137902319 -2.614536059547393e9 +121.185 132.30317207697524 -2.61496112328726e9 +121.19 132.26942926108066 -2.6153862423523645e9 +121.195 132.23598028896762 -2.6158114167158523e9 +121.2 132.20271235017347 -2.6162366463659244e9 +121.205 132.16957132947343 -2.6166619312962174e9 +121.21000000000001 132.1365253212326 -2.6170872715032744e9 +121.215 132.10355327565327 -2.617512666985442e9 +121.22 132.07064026801987 -2.617938117742307e9 +121.225 132.0377751692675 -2.618363623774355e9 +121.23 132.0049493645073 -2.6187891850827575e9 +121.235 131.97215598954347 -2.619214801669216e9 +121.24 131.93938944767135 -2.6196404735358734e9 +121.245 131.90664508899405 -2.6200662006852226e9 +121.25 131.87391898926455 -2.6204919831200542e9 +121.255 131.84120779245532 -2.6209178208434153e9 +121.26 131.80850859566573 -2.6213437138585696e9 +121.265 131.7758188630475 -2.621769662168968e9 +121.27 131.74313636015833 -2.622195665778228e9 +121.275 131.71045910302792 -2.622621724690116e9 +121.28 131.67778531804626 -2.623047838908525e9 +121.285 131.6451134099427 -2.623474008437467e9 +121.29 131.6124419359222 -2.623900233281062e9 +121.295 131.57976958454896 -2.6243265134435196e9 +121.3 131.54709515833514 -2.624752848929142e9 +121.305 131.5144175592615 -2.6251792397423086e9 +121.31 131.48173577663783 -2.625605685887471e9 +121.315 131.4490488768489 -2.6260321873691487e9 +121.32 131.41635599463564 -2.626458744191924e9 +121.325 131.38365632563506 -2.6268853563604383e9 +121.33 131.35094911996066 -2.627312023879383e9 +121.33500000000001 131.31823367664614 -2.627738746753502e9 +121.34 131.28550933881712 -2.628165524987585e9 +121.345 131.2527754894697 -2.6285923585864644e9 +121.35 131.22003154776888 -2.6290192475550175e9 +121.355 131.18727696578685 -2.629446191898159e9 +121.36 131.1545112256187 -2.629873191620836e9 +121.365 131.12173383682148 -2.6303002467280354e9 +121.37 131.08894433413437 -2.6307273572247744e9 +121.375 131.05614227544157 -2.631154523116101e9 +121.38 131.02332723994675 -2.6315817444070926e9 +121.385 130.99049882653162 -2.632009021102858e9 +121.39 130.95765665227842 -2.6324363532085257e9 +121.395 130.92480035113255 -2.6328637407292557e9 +121.4 130.89192957269282 -2.633291183670232e9 +121.405 130.8590439811139 -2.6337186820366564e9 +121.41 130.8269169014502 -2.634146235789713e9 +121.415 130.79400070780832 -2.6345738449596953e9 +121.42 130.76261907567232 -2.635001509491253e9 +121.425 130.72967054490033 -2.6354292294226737e9 +121.43 130.69670479421788 -2.635857004805991e9 +121.435 130.66372155461673 -2.6362848356466036e9 +121.44 130.63072056617736 -2.636712721949931e9 +121.445 130.59770157752345 -2.637140663721409e9 +121.45 130.56466434531896 -2.6375686609664907e9 +121.455 130.53160863380162 -2.637996713690643e9 +121.46000000000001 130.49853421435182 -2.638424821899349e9 +121.465 130.46544086509223 -2.6388529855981064e9 +121.47 130.4323283705165 -2.6392812047924304e9 +121.475 130.39919652114372 -2.639709479487844e9 +121.48 130.36604511319595 -2.640137809689892e9 +121.485 130.3328739482991 -2.6405661954041233e9 +121.49 130.2996828332021 -2.6409946366361074e9 +121.495 130.26647157951552 -2.6414231333914223e9 +121.5 130.23324000346696 -2.6418516856756573e9 +121.505 130.19998792567088 -2.642280293494416e9 +121.51 130.1667151709148 -2.6427089568533134e9 +121.515 130.1334215679567 -2.6431376757579727e9 +121.52 130.10010694933564 -2.6435664502140317e9 +121.525 130.0667711511939 -2.643995280227138e9 +121.53 130.0334140131087 -2.6444241658029466e9 +121.535 130.00003537793467 -2.6448531069471273e9 +121.54 129.9666350916545 -2.6452821036653566e9 +121.545 129.93321300323916 -2.6457111559633217e9 +121.55 129.89976896451395 -2.646140263846719e9 +121.555 129.8663028300336 -2.646569427321255e9 +121.56 129.83281445696443 -2.646998646392644e9 +121.565 129.79930370497044 -2.647427921066611e9 +121.57 129.76577043610754 -2.6478572513488894e9 +121.575 129.73221451472358 -2.6482866372452197e9 +121.58 129.69863580736128 -2.648716078761351e9 +121.58500000000001 129.66503418266728 -2.649145575903044e9 +121.59 129.63140951130768 -2.649575128676063e9 +121.595 129.59776166588398 -2.650004737086182e9 +121.6 129.56409052085584 -2.650434401139184e9 +121.605 129.53039595246665 -2.65086412084086e9 +121.61 129.49667783867278 -2.651293896197005e9 +121.615 129.46293605907672 -2.6517237272134256e9 +121.62 129.42917049486147 -2.652153613895935e9 +121.625 129.39538102873115 -2.65258355625035e9 +121.63 129.36156754484995 -2.653013554282499e9 +121.635 129.32772992878844 -2.6534436079982166e9 +121.64 129.29386806746922 -2.653873717403341e9 +121.645 129.2599818491157 -2.65430388250372e9 +121.65 129.22607116320313 -2.6547341033052115e9 +121.655 129.19213590041267 -2.6551643798136716e9 +121.66 129.1581759525855 -2.6555947120349703e9 +121.665 129.12419121268064 -2.656025099974981e9 +121.67 129.09018157473338 -2.6564555436395826e9 +121.675 129.07819014104516 -2.6568860421148086e9 +121.68 129.04414510789752 -2.657316595493293e9 +121.685 129.01007369932157 -2.6577472046131477e9 +121.69 128.97597580898102 -2.6581778694803762e9 +121.695 128.9418513314203 -2.6586085901009827e9 +121.7 128.9077001620327 -2.6590393664809794e9 +121.705 128.87352219702754 -2.659470198626383e9 +121.71000000000001 128.8393173334011 -2.6599010865432177e9 +121.715 128.80508546890675 -2.6603320302375126e9 +121.72 128.77082650202777 -2.6607630297153053e9 +121.725 128.73654033194984 -2.6611940849826365e9 +121.73 128.70222685853497 -2.6616251960455556e9 +121.735 128.6678859822969 -2.6620563629101133e9 +121.74 128.63351760437706 -2.6624875855823703e9 +121.745 128.5991216265207 -2.6629188640683937e9 +121.75 128.5646979510552 -2.663350198374251e9 +121.755 128.5302464808675 -2.6637815885060186e9 +121.76 128.4957671193839 -2.664213034469782e9 +121.765 128.46125977054976 -2.6646445362716246e9 +121.77 128.4267243388097 -2.6650760939176416e9 +121.775 128.39216072908835 -2.665507707413931e9 +121.78 128.35756884677346 -2.665939376766595e9 +121.785 128.3229485976965 -2.6663711019817452e9 +121.79 128.28829988811674 -2.6668028830654964e9 +121.795 128.25362262470466 -2.667234720023966e9 +121.8 128.2189167145246 -2.6676666128632803e9 +121.805 128.18418206502133 -2.668098561589571e9 +121.81 128.14941858400326 -2.668530566208972e9 +121.815 128.11462617962897 -2.6689626267276244e9 +121.82 128.07980476039182 -2.6693947431516743e9 +121.825 128.04495423510792 -2.6698269154872746e9 +121.83 128.0100745129012 -2.6702591437405787e9 +121.83500000000001 127.97516550319146 -2.6706914279177504e9 +121.84 127.9402271156819 -2.671123768024953e9 +121.845 127.90525926034579 -2.6715561640683603e9 +121.85 127.8702618474163 -2.6719886160541477e9 +121.855 127.83523478737325 -2.672421123988498e9 +121.86 127.80017799093399 -2.672853687877596e9 +121.865 127.76509136904018 -2.6732863077276316e9 +121.87 127.72997483284915 -2.6737189835448046e9 +121.875 127.69482829372244 -2.6741517153353114e9 +121.88 127.65965166321642 -2.674584503105361e9 +121.885 127.6244448530721 -2.6750173468611646e9 +121.89 127.58920777520605 -2.675450246608935e9 +121.895 127.55394034170092 -2.675883202354895e9 +121.9 127.51864246479626 -2.6763162141052685e9 +121.905 127.48331405688029 -2.6767492818662863e9 +121.91 127.44795503048063 -2.6771824056441813e9 +121.915 127.41256529825615 -2.677615585445195e9 +121.92 127.37714477298944 -2.6780488212755694e9 +121.925 127.3416933675782 -2.6784821131415553e9 +121.93 127.30621099502724 -2.678915461049406e9 +121.935 127.27069756844192 -2.6793488650053782e9 +121.94 127.23515300101954 -2.6797823250157366e9 +121.945 127.1995772060434 -2.680215841086747e9 +121.95 127.16397009687414 -2.6806494132246847e9 +121.955 127.12833158694438 -2.6810830414358234e9 +121.96000000000001 127.09266158975117 -2.681516725726445e9 +121.965 127.05696001884942 -2.6819504661028376e9 +121.97 127.02122678784559 -2.6823842625712895e9 +121.975 126.98546181039136 -2.682818115138097e9 +121.98 126.94966500017674 -2.6832520238095627e9 +121.985 126.91383627092596 -2.6836859885919857e9 +121.99 126.87797553638906 -2.6841200094916787e9 +121.995 126.84208271033768 -2.6845540865149555e9 +122. 126.8061577065589 -2.6849882196681323e9 +122.005 126.7702004388498 -2.6854224089575324e9 +122.01 126.73421082101147 -2.6858566543894844e9 +122.015 126.69916607060044 -2.6862909559668803e9 +122.02 126.66311212390139 -2.6867253136260796e9 +122.025 126.62898550697113 -2.6871597274196143e9 +122.03 126.59286661238691 -2.6875941972542157e9 +122.035 126.5567136828701 -2.6880287232630816e9 +122.04 126.52052662726234 -2.6884633054526677e9 +122.045 126.48430535434423 -2.688897943829428e9 +122.05 126.4480497728291 -2.689332638399827e9 +122.055 126.41175979135951 -2.6897673891703343e9 +122.06 126.37543531850221 -2.690202196147418e9 +122.065 126.33907626274325 -2.6906370593375573e9 +122.07 126.30268253248364 -2.691071978747234e9 +122.075 126.26625403603511 -2.6915069543829355e9 +122.08 126.2297906816161 -2.6919419862511497e9 +122.08500000000001 126.19329237734584 -2.6923770743583784e9 +122.09 126.15675903124266 -2.6928122187111163e9 +122.095 126.12019055121687 -2.693247419315872e9 +122.1 126.08358684506923 -2.6936826761791573e9 +122.105 126.04694782048509 -2.6941179893074865e9 +122.11 126.01027338503152 -2.694553358707379e9 +122.115 125.97356344615227 -2.694988784385359e9 +122.12 125.936817911165 -2.6954242663479586e9 +122.125 125.9000366872568 -2.6958598046017094e9 +122.13 125.86321968147982 -2.6962953991531515e9 +122.135 125.8263668007487 -2.696731050008831e9 +122.14 125.78947795183637 -2.697166757175293e9 +122.145 125.75255304136935 -2.697602520659093e9 +122.15 125.71559197582535 -2.69803834046679e9 +122.155 125.67859466153001 -2.6984742166049457e9 +122.16 125.64156100465166 -2.698910149080128e9 +122.165 125.604490911199 -2.6993461378989124e9 +122.17 125.56738428701763 -2.699782183067872e9 +122.175 125.53024103778573 -2.7002182845935917e9 +122.18 125.49306106901173 -2.7006544424826593e9 +122.185 125.45584428603013 -2.701090656741665e9 +122.19 125.41859059399832 -2.7015269273772063e9 +122.195 125.38129989789363 -2.7019632543958845e9 +122.2 125.34397210250908 -2.702399637804308e9 +122.205 125.30660711245164 -2.702836077609085e9 +122.21000000000001 125.26920483213715 -2.7032725738168344e9 +122.215 125.23176516578879 -2.7037091264341736e9 +122.22 125.1942880174328 -2.7041457354677315e9 +122.225 125.15677329089549 -2.704582400924138e9 +122.23 125.11922088980039 -2.705019122810028e9 +122.235 125.08163071756493 -2.705455901132042e9 +122.24 125.04400267739769 -2.705892735896825e9 +122.245 125.00633667229418 -2.706329627111028e9 +122.25 124.96863260503574 -2.7067665747813044e9 +122.255 124.93089037818457 -2.7072035789143147e9 +122.26 124.8931098940817 -2.707640639516725e9 +122.265 124.85529105484385 -2.7080777565952024e9 +122.27 124.81743376236003 -2.7085149301564226e9 +122.275 124.77953791828958 -2.708952160207067e9 +122.28 124.74160342405831 -2.7093894467538157e9 +122.285 124.70363018085511 -2.709826789803361e9 +122.29 124.66561808963061 -2.710264189362397e9 +122.295 124.62756705109322 -2.710701645437621e9 +122.3 124.58947696570581 -2.7111391580357385e9 +122.305 124.55134773368377 -2.7115767271634593e9 +122.31 124.51317925499208 -2.712014352827495e9 +122.315 124.47497142934154 -2.712452035034566e9 +122.32 124.43672415618676 -2.7128897737913957e9 +122.325 124.39843733472323 -2.713327569104714e9 +122.33 124.3601108638838 -2.7137654209812536e9 +122.33500000000001 124.32174464233678 -2.7142033294277544e9 +122.34 124.28333856848292 -2.714641294450959e9 +122.345 124.24489254045179 -2.715079316057617e9 +122.35 124.20640645609974 -2.7155173942544823e9 +122.355 124.16788021300732 -2.715955529048315e9 +122.36 124.1293137084758 -2.7163937204458776e9 +122.365 124.09070683952493 -2.7168319684539385e9 +122.37 124.05205950288918 -2.7172702730792756e9 +122.375 124.01337159501716 -2.717708634328663e9 +122.38 123.97464301206604 -2.718147052208888e9 +122.385 123.93587364990084 -2.718585526726741e9 +122.39 123.89706340409087 -2.7190240578890133e9 +122.395 123.85821216990723 -2.7194626457025065e9 +122.4 123.8193198423194 -2.7199012901740265e9 +122.405 123.78038631599402 -2.7203399913103795e9 +122.41 123.74141148529043 -2.7207787491183834e9 +122.415 123.70239524425828 -2.7212175636048594e9 +122.42 123.66333748663597 -2.7216564347766285e9 +122.425 123.62423810584671 -2.722095362640525e9 +122.43 123.5850969949961 -2.7225343472033844e9 +122.435 123.54591404686957 -2.722973388472046e9 +122.44 123.5066891539295 -2.723412486453355e9 +122.445 123.46742220831197 -2.7238516411541653e9 +122.45 123.42811310182537 -2.7242908525813327e9 +122.455 123.38876172594584 -2.724730120741719e9 +122.46000000000001 123.3493679718163 -2.725169445642191e9 +122.465 123.30993173024254 -2.7256088272896194e9 +122.47 123.27045289169072 -2.726048265690885e9 +122.475 123.23093134628508 -2.7264877608528686e9 +122.48 123.19136698380382 -2.72692731278246e9 +122.485 123.15175969367861 -2.7273669214865503e9 +122.49 123.11210936498972 -2.72780658697204e9 +122.495 123.07241588646384 -2.728246309245835e9 +122.5 123.03267914647245 -2.7286860883148413e9 +122.505 122.99289903302717 -2.729125924185976e9 +122.51 122.95307543377821 -2.72956581686616e9 +122.515 122.91320823601183 -2.7300057663623166e9 +122.52 122.87329732664624 -2.7304457726813784e9 +122.525 122.83334259222968 -2.730885835830283e9 +122.53 122.79334391893775 -2.731325955815971e9 +122.535 122.75330119257053 -2.7317661326453896e9 +122.54 122.71321429854842 -2.7322063663254943e9 +122.545 122.67308312191221 -2.7326466568632402e9 +122.55 122.6329075473169 -2.7330870042655907e9 +122.555 122.59268745903105 -2.7335274085395203e9 +122.56 122.55242274093388 -2.733967869691999e9 +122.565 122.51211327651073 -2.734408387730009e9 +122.57 122.47175894885211 -2.7348489626605353e9 +122.575 122.4313596406494 -2.7352895944905734e9 +122.58 122.39091523419384 -2.7357302832271147e9 +122.58500000000001 122.35042561137017 -2.7361710288771667e9 +122.59 122.30989065365841 -2.736611831447735e9 +122.595 122.27059002631292 -2.7370526909214535e9 +122.6 122.22996498713661 -2.7374936072575426e9 +122.605 122.19186168546828 -2.7379345804171667e9 +122.61 122.15114543866844 -2.7383756104498234e9 +122.615 122.11038142062742 -2.7388166974381623e9 +122.62 122.0695695010391 -2.7392578413893695e9 +122.625 122.02870954910927 -2.739699042310628e9 +122.63 121.9878014335514 -2.740140300209134e9 +122.635 121.94684502258407 -2.740581615092087e9 +122.64 121.90584018392687 -2.741022986966693e9 +122.645 121.86478678479706 -2.741464415840164e9 +122.65 121.82368469190584 -2.741905901719723e9 +122.655 121.78253377145555 -2.7423474446125917e9 +122.66 121.7413338891358 -2.742789044526004e9 +122.665 121.70008491011927 -2.7432307014671974e9 +122.67 121.65878669905936 -2.7436724154434175e9 +122.675 121.61743912008531 -2.7441141864619155e9 +122.68 121.57604203679962 -2.744556014529951e9 +122.685 121.53459531227432 -2.744997899654785e9 +122.69 121.49309880904647 -2.74543984184369e9 +122.695 121.45155238911529 -2.745881841103945e9 +122.7 121.40995591393859 -2.7463238974428344e9 +122.705 121.36830924442816 -2.746766010867646e9 +122.71000000000001 121.32661224094726 -2.7472081813856807e9 +122.715 121.28486476330569 -2.7476504090042396e9 +122.72 121.2430666707571 -2.7480926937306337e9 +122.725 121.2012178219945 -2.7485350355721827e9 +122.73 121.15931807514612 -2.7489774345362105e9 +122.735 121.11736728777296 -2.7494198906300454e9 +122.74 121.07536531686335 -2.7498624038610277e9 +122.745 121.03331201883 -2.7503049742365003e9 +122.75 120.99120724950632 -2.750747601763816e9 +122.755 120.9490508641413 -2.7511902864503303e9 +122.76 120.90684271739663 -2.7516330283034124e9 +122.765 120.87239230427623 -2.752075827137149e9 +122.77 120.83008922003242 -2.752518682841174e9 +122.775 120.78773357890913 -2.752961595733396e9 +122.78 120.7453252310519 -2.75340456582123e9 +122.785 120.70286402598146 -2.753847593112098e9 +122.79 120.66034981259251 -2.754290677613434e9 +122.795 120.61778243914867 -2.754733819332672e9 +122.8 120.57516175327683 -2.7551770182772584e9 +122.805 120.53248760196465 -2.755620274454646e9 +122.81 120.48975983155532 -2.7560635878722916e9 +122.815 120.44697828774352 -2.756506958537662e9 +122.82 120.40414281557057 -2.756950386458232e9 +122.825 120.36125325942038 -2.7573938716414843e9 +122.83 120.31830946301505 -2.7578374140949044e9 +122.83500000000001 120.27531126941022 -2.7582810138259892e9 +122.84 120.23225852099038 -2.7587246708422403e9 +122.845 120.1891510594646 -2.7591683851511703e9 +122.85 120.14598872586204 -2.7596121567602963e9 +122.855 120.1027713605268 -2.760055985677145e9 +122.86 120.0594988031139 -2.7604998719092455e9 +122.865 120.01617089258421 -2.760943815464143e9 +122.87 119.97458074616347 -2.7613878163469486e9 +122.875 119.73184101023294 -2.7618319188860226e9 +122.88 119.68810287836446 -2.762276048895362e9 +122.885 119.64430879920893 -2.7627202362718415e9 +122.89 119.60045860952054 -2.763164481023012e9 +122.895 119.55655214534103 -2.76360878315644e9 +122.9 119.5125892419962 -2.764053142679695e9 +122.905 119.46856973408998 -2.764497559600353e9 +122.91 119.42449345549885 -2.7649420339259996e9 +122.915 119.3803602393692 -2.7653865656642303e9 +122.92 119.33616991811027 -2.765831154822643e9 +122.925 119.29192232339012 -2.766275801408848e9 +122.93 119.24761728612987 -2.766720505430462e9 +122.935 119.20325463650046 -2.7671652668951063e9 +122.94 119.15883420391518 -2.767610085810415e9 +122.945 119.11435581702605 -2.7680549621840267e9 +122.95 119.06981930371823 -2.768499896023593e9 +122.955 119.02522449110482 -2.7689448873367634e9 +122.96000000000001 118.98057120552173 -2.7693899361312056e9 +122.965 118.93585927252187 -2.769835042414589e9 +122.97 118.89108851687062 -2.7702802061945934e9 +122.975 118.84625876253997 -2.7707254274789076e9 +122.98 118.80136983270317 -2.771170706275226e9 +122.985 118.75642154972945 -2.7716160425912533e9 +122.99 118.71141373517794 -2.7720614364347e9 +122.995 118.66634620979305 -2.7725068878132887e9 +123. 118.62121879349813 -2.772952396734745e9 +123.005 118.5760313053903 -2.773397963206805e9 +123.01 118.53078356373402 -2.7738435872372174e9 +123.015 118.48547538595723 -2.7742892688337307e9 +123.02 118.44010658864288 -2.7747350080041084e9 +123.025 118.3946769875252 -2.775180804756122e9 +123.03 118.34918639748365 -2.7756266590975456e9 +123.035 118.30363463253552 -2.7760725710361676e9 +123.04 118.25802150583186 -2.7765185405797863e9 +123.045 118.21234682965058 -2.7769645677362e9 +123.05 118.16661041539011 -2.777410652513223e9 +123.055 118.12081207356395 -2.777856794918678e9 +123.06 118.07495161379433 -2.778302994960391e9 +123.065 118.02902884480591 -2.778749252646202e9 +123.07 117.98304357441931 -2.7791955679839563e9 +123.075 117.93699560954563 -2.7796419409815135e9 +123.08 117.89088475617979 -2.780088371646731e9 +123.08500000000001 117.84471081939213 -2.7805348599874873e9 +123.09 117.79847360332641 -2.7809814060116606e9 +123.095 117.75217291118885 -2.7814280097271433e9 +123.1 117.70580854524383 -2.781874671141834e9 +123.105 117.65938030680694 -2.7823213902636433e9 +123.11 117.61288799623848 -2.782768167100485e9 +123.115 117.56633141293614 -2.783215001660288e9 +123.12 117.52143410389283 -2.7836618939024377e9 +123.125 117.4752068832732 -2.7841088438075805e9 +123.13 117.43146004054003 -2.784555851216819e9 +123.135 117.38464596510595 -2.7850029163744683e9 +123.14 117.33776373553886 -2.785450039294943e9 +123.145 117.29081312676203 -2.785897219986432e9 +123.15 117.24379391254145 -2.7863444584571366e9 +123.155 117.19670586547575 -2.7867917547152624e9 +123.16 117.14954875698713 -2.7872391087690306e9 +123.165 117.1023223573137 -2.7876865206266713e9 +123.17 117.05502643549964 -2.788133990296424e9 +123.175 117.00766075938687 -2.788581517786541e9 +123.18 116.96022509560612 -2.7890291031052856e9 +123.185 116.91271920956751 -2.789476746260927e9 +123.19 116.89726781335854 -2.789924446561654e9 +123.195 116.86649415884901 -2.7903722021309915e9 +123.2 116.81884266622986 -2.790820015366563e9 +123.205 116.77111643606044 -2.79126788646868e9 +123.21000000000001 116.72331520195888 -2.7917158154459343e9 +123.215 116.6754386960469 -2.7921638023069215e9 +123.22 116.62748664893593 -2.7926118470602546e9 +123.225 116.5794587897162 -2.7930599497145567e9 +123.23 116.53135484594404 -2.793508110278467e9 +123.235 116.48317454362996 -2.793956328760635e9 +123.24 116.43491760722559 -2.794404605169722e9 +123.245 116.38658375961141 -2.7948529395144067e9 +123.25 116.33817272208498 -2.795301331803374e9 +123.255 116.28968421434641 -2.795749782045328e9 +123.26 116.24111795448663 -2.796198290248985e9 +123.265 116.19247365897337 -2.79664685642307e9 +123.27 116.14375104263975 -2.797095480576327e9 +123.275 116.09494981866827 -2.79754416271751e9 +123.28 116.04606969857996 -2.7979929028553867e9 +123.285 115.99711039221874 -2.798441700998741e9 +123.29 115.94807160773874 -2.7988905571563683e9 +123.295 115.8989530515905 -2.7993394713370743e9 +123.3 115.84975442850606 -2.7997884435496845e9 +123.305 115.8004754414851 -2.8002374738030357e9 +123.31 115.75111579178137 -2.800686562105977e9 +123.315 115.70167517888758 -2.8011357084673734e9 +123.32 115.65215330051986 -2.8015849128961034e9 +123.325 115.60254985260524 -2.80203417540106e9 +123.33 115.55286452926408 -2.802483495991148e9 +123.33500000000001 115.5030970227967 -2.8029328746752915e9 +123.34 115.45324702366798 -2.8033823114624224e9 +123.345 115.40331422049137 -2.8038318063614917e9 +123.35 115.35329830001312 -2.804281359381464e9 +123.355 115.3031989470975 -2.804730970531319e9 +123.36 115.25301584471002 -2.8051806398200474e9 +123.365 115.20274867390158 -2.805630367256659e9 +123.37 115.15239711379284 -2.806080152850178e9 +123.375 115.10196084155622 -2.806529996609638e9 +123.38 115.05143953240123 -2.806979898544095e9 +123.385 115.00083285955593 -2.807429858662618e9 +123.39 114.95014049425153 -2.807879876974286e9 +123.395 114.89936210570397 -2.808329953488199e9 +123.4 114.8484973610967 -2.808780088213473e9 +123.405 114.79754592556458 -2.809230281159232e9 +123.41 114.74650746217421 -2.8096805323346243e9 +123.415 114.69538163190695 -2.8101308417488093e9 +123.42 114.6441680936415 -2.81058120941096e9 +123.425 114.5928665041341 -2.811031635330271e9 +123.43 114.54147651800095 -2.811482119515948e9 +123.435 114.48999778769961 -2.811932661977213e9 +123.44 114.43842996350922 -2.8123832627233067e9 +123.445 114.38677269351244 -2.812833921763484e9 +123.45 114.33502562357563 -2.813284639107017e9 +123.455 114.2831883973289 -2.8137354147631927e9 +123.46000000000001 114.23126065614676 -2.8141862487413163e9 +123.465 114.17924203912835 -2.814637141050707e9 +123.47 114.12713218307697 -2.815088091700701e9 +123.475 114.07493072247867 -2.815539100700656e9 +123.48 114.02263728948377 -2.8159901680599403e9 +123.485 113.97025151388378 -2.816441293787942e9 +123.49 113.91777302309174 -2.816892477894065e9 +123.495 113.86520144211914 -2.817343720387734e9 +123.5 113.81253639355677 -2.8177950212783833e9 +123.505 113.75977749755019 -2.8182463805754714e9 +123.51 113.70692437177948 -2.818697798288474e9 +123.515 113.65397663143631 -2.8191492744268785e9 +123.52 113.60093388920086 -2.819600809000195e9 +123.525 113.54779575521881 -2.8200524020179515e9 +123.53 113.49456183707926 -2.8205040534896903e9 +123.535 113.44123173979074 -2.8209557634249725e9 +123.54 113.38780506575647 -2.8214075318333826e9 +123.545 113.33428141475214 -2.8218593587245135e9 +123.55 113.28066038390027 -2.822311244107985e9 +123.555 113.22694156764618 -2.8227631879934335e9 +123.56 113.17312455773306 -2.823215190390509e9 +123.565 113.11920894317751 -2.8236672513088846e9 +123.57 113.06519431024226 -2.824119370758252e9 +123.575 113.01108024241242 -2.8245715487483215e9 +123.58 112.95686632036912 -2.825023785288819e9 +123.58500000000001 112.90255212196132 -2.825476080389494e9 +123.59 112.84813722218159 -2.825928434060112e9 +123.595 112.79362119313787 -2.8263808463104596e9 +123.6 112.73900360402614 -2.8268333171503425e9 +123.605 112.68428402110239 -2.8272858465895867e9 +123.61 112.62946200765654 -2.827738434638035e9 +123.615 112.57453712398186 -2.8281910813055525e9 +123.62 112.51950892734705 -2.828643786602025e9 +123.625 112.46679152851775 -2.829096550480029e9 +123.63 112.41640212825072 -2.8295493728454466e9 +123.635 112.3610699069257 -2.830002253590741e9 +123.64 112.30562773177816 -2.8304551930045023e9 +123.645 112.25007509977395 -2.830908191097049e9 +123.65 112.19441150417668 -2.831361247878728e9 +123.655 112.13863643451181 -2.8318143633598995e9 +123.66 112.08274937652486 -2.8322675375509567e9 +123.665 112.02674981214437 -2.8327207704623127e9 +123.67 111.97063721944299 -2.833174062104404e9 +123.675 111.91441107259614 -2.833627412487692e9 +123.68 111.85807084184184 -2.8340808216226635e9 +123.685 111.80161599344038 -2.8345342895198283e9 +123.69 111.74504598963169 -2.8349878161897197e9 +123.695 111.68836028859425 -2.8354414016428986e9 +123.7 111.63155834440148 -2.83589504588995e9 +123.705 111.57463960697831 -2.8363487489414816e9 +123.71000000000001 111.51760352205854 -2.8368025108081303e9 +123.715 111.46044953113994 -2.837256331500555e9 +123.72 111.4031770714379 -2.8377102110294423e9 +123.725 111.34578557584115 -2.8381641494055033e9 +123.73 111.28827447286442 -2.838618146639478e9 +123.735 111.23064318660329 -2.839072202742129e9 +123.74 111.17289113668465 -2.8395263177242465e9 +123.745 111.11501773821897 -2.8399804915966506e9 +123.75 111.05702240175212 -2.840434724370181e9 +123.755 110.99890453321568 -2.8408890160557113e9 +123.76 110.94066353387501 -2.8413433666641417e9 +123.765 110.88229880028139 -2.841797776206393e9 +123.77 110.82380972421711 -2.842252244693422e9 +123.775 110.765195692645 -2.842706772136209e9 +123.78 110.7064560876549 -2.8431613585457625e9 +123.785 110.64759028641004 -2.8436160039331193e9 +123.79 110.58859766109083 -2.8440707083093486e9 +123.795 110.52947757884206 -2.8445254716855407e9 +123.8 110.47022940171433 -2.84498029407282e9 +123.805 110.41085248660877 -2.845435175482341e9 +123.81 110.35134618521732 -2.845890115925283e9 +123.815 110.29170984396626 -2.846345115412858e9 +123.82 110.23194280395559 -2.8468001739563065e9 +123.825 110.1720444008976 -2.847255291566901e9 +123.83 110.11201396505815 -2.847710468255941e9 +123.83500000000001 110.05185082119202 -2.8481657040347595e9 +123.84 109.99155428848209 -2.8486209989147177e9 +123.845 109.93112368047329 -2.8490763529072094e9 +123.85 109.87055830500925 -2.8495317660236588e9 +123.855 109.8098574641661 -2.8499872382755227e9 +123.86 109.74902045418497 -2.850442769674287e9 +123.865 109.688046565405 -2.8508983602314715e9 +123.87 109.62693508219394 -2.85135400995863e9 +123.875 109.56568528287931 -2.851809718867344e9 +123.88 109.5042964396758 -2.85226548696923e9 +123.885 109.44276781861481 -2.852721314275941e9 +123.89 109.38109867947114 -2.8531772007991543e9 +123.895 109.31928827568811 -2.8536331465505905e9 +123.9 109.2573358543026 -2.8540891515419993e9 +123.905 109.19524065586971 -2.854545215785162e9 +123.91 109.13300191438364 -2.8550013392918987e9 +123.915 109.07061885719985 -2.8554575220740633e9 +123.92 109.00809070495427 -2.8559137641435423e9 +123.925 108.94541667148384 -2.8563700655122576e9 +123.93 108.88259596374117 -2.856826426192169e9 +123.935 108.81962778171413 -2.8572828461952705e9 +123.94 108.75651131833841 -2.8577393255335913e9 +123.945 108.6932457594117 -2.858195864219198e9 +123.95 108.62983028350601 -2.8586524622641945e9 +123.955 108.56626406187961 -2.859109119680718e9 +123.96000000000001 108.50254625838464 -2.859565836480949e9 +123.965 108.43867602937681 -2.860022612677099e9 +123.97 108.37465252362054 -2.8604794482814226e9 +123.975 108.31047488219573 -2.860936343306209e9 +123.98 108.24614223839913 -2.8613932977637906e9 +123.985 108.18165371764925 -2.8618503116665316e9 +123.99 108.11700843738403 -2.86230738502684e9 +123.995 108.0522055069608 -2.862764517857166e9 +124. 107.9872440275546 -2.8632217101699905e9 +124.005 107.92212309205169 -2.863678961977845e9 +124.01 107.85684178494387 -2.864136273293296e9 +124.015 107.79139918222269 -2.86459364412895e9 +124.02 107.72579435126671 -2.8650510744974566e9 +124.025 107.66002635073107 -2.8655085644115105e9 +124.03 107.59409423043523 -2.865966113883841e9 +124.035 107.52799703124634 -2.866423722927225e9 +124.04 107.46173378496289 -2.866881391554484e9 +124.045 107.39530351419484 -2.867339119778474e9 +124.05 107.32870523224341 -2.8677969076121035e9 +124.055 107.261937942976 -2.868254755068321e9 +124.06 107.19500064070436 -2.868712662160119e9 +124.065 107.12789231005304 -2.8691706289005356e9 +124.07 107.06061192583267 -2.8696286553026543e9 +124.075 106.99669696223343 -2.870086741219637e9 +124.08 106.93617734656159 -2.870544886418695e9 +124.08500000000001 106.8683879888928 -2.871003091195138e9 +124.09 106.83783957092857 -2.871461355063794e9 +124.095 106.81872976474 -2.871919676315404e9 +124.1 106.75061281483798 -2.872378056236548e9 +124.105 106.68230775100534 -2.8728364959022436e9 +124.11 106.41441644762352 -2.873295001911248e9 +124.115 106.34519041275976 -2.873753573894313e9 +124.12 106.27577124539464 -2.8742122056918507e9 +124.125 106.20615767108093 -2.874670897318082e9 +124.13 106.13634840171859 -2.875129648787285e9 +124.135 106.06634213534916 -2.875588460113797e9 +124.14 105.99613755595014 -2.876047331312012e9 +124.145 105.92573333322397 -2.876506262396384e9 +124.15 105.85512812238098 -2.876965253381428e9 +124.155 105.7843205639208 -2.877424304281716e9 +124.16 105.71330928340946 -2.8778834151118855e9 +124.165 105.64209289124904 -2.8783425858866343e9 +124.17 105.57066998244731 -2.87880181662072e9 +124.175 105.49903913637783 -2.879261107328965e9 +124.18 105.42719891654127 -2.879720458026258e9 +124.185 105.3551478703159 -2.8801798687275467e9 +124.19 105.28288452870682 -2.8806393394478483e9 +124.195 105.21040740609006 -2.8810988702022443e9 +124.2 105.13771499994932 -2.8815584610058837e9 +124.205 105.06480579060997 -2.8820181118739786e9 +124.21000000000001 104.9916782409648 -2.882477822821816e9 +124.215 104.91833079619933 -2.8829375938647437e9 +124.22 104.84476188350364 -2.8833974250181847e9 +124.225 104.77096991178456 -2.8838573162976313e9 +124.23 104.696953271371 -2.884317267718646e9 +124.235 104.64485181422987 -2.884777278893773e9 +124.24 104.57044611249582 -2.8852373493716245e9 +124.245 104.49580892342213 -2.885697480035001e9 +124.25 104.42093852769248 -2.886157670899868e9 +124.255 104.34583318521572 -2.886617921982274e9 +124.26 104.2704911347782 -2.8870782332983437e9 +124.265 104.19491059368823 -2.887538604864277e9 +124.27 104.11908975740864 -2.887999036696356e9 +124.275 104.04302679918456 -2.8884595288109474e9 +124.28 103.9667198696655 -2.88892008122449e9 +124.285 103.8901670965143 -2.889380693953512e9 +124.29 103.8133665840064 -2.8898413670146265e9 +124.295 103.73631641263118 -2.890302100424524e9 +124.3 103.6590146386677 -2.890762894199984e9 +124.305 103.58145929376464 -2.891223748357876e9 +124.31 103.50364838450471 -2.891684662915149e9 +124.315 103.42557989196001 -2.892145637888849e9 +124.32 103.34725177123666 -2.8926066732961063e9 +124.325 103.26866195101168 -2.8930677691541452e9 +124.33 103.18980833305598 -2.893528925480278e9 +124.33500000000001 103.11068879174772 -2.893990142291914e9 +124.34 103.03130117357635 -2.894451419606553e9 +124.345 102.95164329662919 -2.8949127574417944e9 +124.35 102.87171295007298 -2.895374155815332e9 +124.355 102.7915078936187 -2.895835614744958e9 +124.36 102.71102585697648 -2.896297134248561e9 +124.365 102.63026453929389 -2.8967587143441343e9 +124.37 102.54922160858337 -2.8972203550497723e9 +124.375 102.46789470113754 -2.8976820563836675e9 +124.38 102.3862814209257 -2.8981438183641224e9 +124.385 102.30437933897956 -2.898605641009544e9 +124.39 102.22218599276174 -2.8990675243384447e9 +124.395 102.22625751089328 -2.899529465722157e9 +124.4 102.21554559655434 -2.8999914625957823e9 +124.405 102.13300852027135 -2.900453518366495e9 +124.41 102.05014992537816 -2.9009156348701367e9 +124.415 101.9669667649686 -2.901377812127103e9 +124.42 101.88345594490295 -2.901840050157919e9 +124.425 101.79961432278286 -2.902302348983258e9 +124.43 101.71543870690164 -2.9027647086239347e9 +124.435 101.63092585516492 -2.903227129100907e9 +124.44 101.54607247397945 -2.9036896104352813e9 +124.445 101.46087521710837 -2.904152152648315e9 +124.45 101.375330684501 -2.904614755761416e9 +124.455 101.28943542108037 -2.9050774197961445e9 +124.46000000000001 101.20318591550073 -2.9055401447742224e9 +124.465 101.12209767399553 -2.906002930543769e9 +124.47 101.04623717785245 -2.9064657766266637e9 +124.475 100.95894320755647 -2.906928683554648e9 +124.48 100.87126024169584 -2.9073916515134625e9 +124.485 100.78318401442833 -2.9078546805268884e9 +124.49 100.69471018311629 -2.908317770618906e9 +124.495 100.60583432639243 -2.9087809218136964e9 +124.5 100.51655194216302 -2.9092441341356435e9 +124.505 100.42685844554701 -2.909707407609338e9 +124.51 100.3367491667429 -2.910170742259585e9 +124.515 100.24621934883127 -2.9106341381114016e9 +124.52 100.1552641454967 -2.911097595190025e9 +124.525 100.06387861867894 -2.91156111352092e9 +124.53 99.97205773614165 -2.9120246931297708e9 +124.535 99.87979636895611 -2.9124883340424976e9 +124.54 99.78708928890353 -2.9129520362852616e9 +124.545 99.6939311657815 -2.9134157998844523e9 +124.55 99.60031656461916 -2.9138796248667145e9 +124.555 99.50623994279428 -2.91434351125894e9 +124.56 99.41169564704711 -2.914807459088273e9 +124.565 99.31667791038642 -2.915271468382119e9 +124.57 99.22118084888656 -2.915735539168148e9 +124.575 99.1251984583646 -2.9161996714743004e9 +124.58 99.02872461093867 -2.9166638653287907e9 +124.58500000000001 98.93175305145448 -2.917128120760116e9 +124.59 98.83427739378865 -2.917592437797057e9 +124.595 98.73629111699604 -2.91805681646869e9 +124.6 98.63778756132977 -2.9185212568043876e9 +124.605 98.53875992409603 -2.9189857588338313e9 +124.61 98.43920125535499 -2.9194503225870066e9 +124.615 98.33910445345217 -2.919914948094224e9 +124.62 98.23846226037539 -2.9203796353861146e9 +124.625 98.13726725692909 -2.9208443844936414e9 +124.63 98.03551185771467 -2.9213091954481063e9 +124.635 97.93318830590862 -2.921774068281161e9 +124.64 97.83028866782871 -2.922239003024804e9 +124.645 97.72680482727901 -2.922703999711403e9 +124.65 97.62272847966004 -2.9231690583736925e9 +124.655 97.51805112583058 -2.923634179044784e9 +124.66 97.41276406571568 -2.924099361758179e9 +124.665 97.30685839163928 -2.9245646065477753e9 +124.67 97.20032498137252 -2.925029913447874e9 +124.675 97.09315449087843 -2.9254952824931917e9 +124.68 96.98533734674301 -2.9259607137188725e9 +124.685 96.87686373826871 -2.926426207160492e9 +124.69 96.76772360921551 -2.926891762854075e9 +124.695 96.65790664917222 -2.9273573808361034e9 +124.7 96.54740228453383 -2.9278230611435246e9 +124.705 96.43619966906176 -2.928288803813768e9 +124.71000000000001 96.32428767401022 -2.928754608884755e9 +124.715 96.21165487778708 -2.929220476394911e9 +124.72 96.09828955512398 -2.9296864063831787e9 +124.725 95.98417966572737 -2.9301523988890357e9 +124.73 95.8693128423833 -2.930618453952503e9 +124.735 95.75367637847823 -2.9310845716141605e9 +124.74 95.63725721489887 -2.9315507519151654e9 +124.745 95.52004192628269 -2.9320169948972664e9 +124.75 95.4020167065725 -2.932483300602817e9 +124.755 95.28316735382636 -2.932949669074797e9 +124.76 95.16347925424714 -2.93341610035683e9 +124.765 95.0465425324097 -2.9338825944254603e9 +124.77 94.925157089636 -2.9343491512563105e9 +124.775 94.80288683297474 -2.9348157710308976e9 +124.78 94.7087647447561 -2.935282453252632e9 +124.785 94.58484645019263 -2.9357491974045935e9 +124.79 94.45993440569282 -2.936216004635648e9 +124.795 94.33400812877677 -2.9366828749978385e9 +124.8 94.20704643560092 -2.937149808544153e9 +124.805 94.07902740705005 -2.9376168053285546e9 +124.81 93.94992835270655 -2.938083865406008e9 +124.815 93.82177482694033 -2.9385509888082576e9 +124.82 93.69046169122215 -2.9390181755260396e9 +124.825 93.55799578372942 -2.9394854257073565e9 +124.83 93.42435093238531 -2.9399527394115553e9 +124.83500000000001 93.28949997592991 -2.940420116699191e9 +124.84 93.15341471106228 -2.9408875576320553e9 +124.845 93.01606583588085 -2.94135506227324e9 +124.85 92.87742288933988 -2.941822630687178e9 +124.855 92.7374541863495 -2.9422902629397e9 +124.86 92.59612674814137 -2.942757959098083e9 +124.865 92.45340622746424 -2.943225719231122e9 +124.87 92.3092568281398 -2.943693543409185e9 +124.875 92.16364121845069 -2.944161431704273e9 +124.88 92.01652043776043 -2.9446293841901035e9 +124.885 91.8678537957318 -2.945097400942175e9 +124.89 91.71759876338763 -2.9455654820378466e9 +124.895 91.56571085521773 -2.9460336275564275e9 +124.9 91.41214350139813 -2.9465018375792627e9 +124.905 91.25684790909732 -2.946970112189822e9 +124.91 91.09977291171748 -2.947438451473818e9 +124.915 90.94086480474795 -2.9479068555192957e9 +124.92 90.78006716676553 -2.948375324416759e9 +124.925 90.61732066389557 -2.9488438582592945e9 +124.93 90.45256283583413 -2.949312457142703e9 +124.935 90.28572786126375 -2.9497811211656375e9 +124.94 90.11674630018315 -2.9502498504297657e9 +124.945 89.94554481030951 -2.9507186450399313e9 +124.95 89.77204583431377 -2.951187505104334e9 +124.955 89.59616725411799 -2.9516564307347155e9 +124.96000000000001 89.41782200792325 -2.9521254220465813e9 +124.965 89.23691766495595 -2.9525944791594143e9 +124.97 89.05335595205948 -2.953063602196932e9 +124.975 88.86703222533687 -2.953532791287348e9 +124.98 88.67783487881066 -2.9540020465636663e9 +124.985 88.48564468070985 -2.9544713681639996e9 +124.99 88.29033402624567 -2.954940756231926e9 +124.995 88.09176609368689 -2.955410210916869e9 +125. 87.88979388798721 -2.9558797323745217e9 +125.005 87.71795693045247 -2.9563493203609495e9 +125.01 87.53696554066785 -2.956818972743965e9 +125.015 87.3244903524204 -2.957288692280645e9 +125.02 87.10760261105 -2.9577584792642674e9 +125.025 86.8860492836132 -2.9582283339065e9 +125.03 86.65955243964244 -2.958698256430865e9 +125.035 86.42780568988181 -2.959168247073925e9 +125.04 86.19046994278771 -2.95963830608664e9 +125.045 85.9471683119964 -2.9601084337359204e9 +125.05 85.69747995751683 -2.960578630306447e9 +125.055 85.44093257454479 -2.9610488961027765e9 +125.06 85.17699314840137 -2.9615192314518175e9 +125.065 85.01036674517607 -2.9619896357026787e9 +125.07 84.77753118741313 -2.9624601040539274e9 +125.075 84.49241504545506 -2.9629306427169075e9 +125.08 84.19720669680297 -2.9634012523010197e9 +125.08500000000001 83.93037055719948 -2.9638719331654882e9 +125.09 83.9337254906679 -2.9643426761850524e9 +125.095 83.93708042413456 -2.964813475450286e9 +125.1 83.94043535760244 -2.9652843309656744e9 \ No newline at end of file diff --git a/docs/source/faqs.rst b/docs/source/faqs.rst index c2431891..2331078b 100644 --- a/docs/source/faqs.rst +++ b/docs/source/faqs.rst @@ -156,6 +156,18 @@ Effective potentials enum :py:class:`WallGo.PotentialTools.EImaginaryOption`. See the docs for more details. +Free energy +----------- +- **I already know the value of the field and the effective potential as a function of temperature, can I provide these to WallGo to circumvent the phase tracing?** + + If the phase tracing does not work properly for your model, or if you want to speed up the + initialization phase, you can provide arrays with the values of the field(s) in the minimum of the + potential and the corresponding effective potential for the appropriate temperature range. + These are passed as a :py:class:`WallGo.FreeEnergyArrays` object, to the function + :py:meth:`WallGo.WallGoManager.setupThermodynamicsHydrodynamics()`. These arrays are optional arguments; + if they are not provided, WallGo will execute its default phase tracing algorithm. + + Settings ======== diff --git a/src/WallGo/__init__.py b/src/WallGo/__init__.py index c4554d17..7c580fc7 100644 --- a/src/WallGo/__init__.py +++ b/src/WallGo/__init__.py @@ -8,11 +8,11 @@ from .boltzmann import BoltzmannSolver, ETruncationOption from .config import Config from .collisionArray import CollisionArray -from .containers import PhaseInfo, BoltzmannBackground, BoltzmannDeltas, WallParams +from .containers import PhaseInfo, BoltzmannBackground, BoltzmannDeltas, FreeEnergyArrays, WallParams from .effectivePotential import EffectivePotential, VeffDerivativeSettings from .exceptions import WallGoError, WallGoPhaseValidationError, CollisionLoadError from .fields import Fields -from .freeEnergy import FreeEnergy +from .freeEnergy import FreeEnergy, FreeEnergyValueType from .genericModel import GenericModel from .grid import Grid from .grid3Scales import Grid3Scales diff --git a/src/WallGo/containers.py b/src/WallGo/containers.py index 16b300d7..5289b8dd 100644 --- a/src/WallGo/containers.py +++ b/src/WallGo/containers.py @@ -4,6 +4,7 @@ from dataclasses import dataclass import numpy as np from .fields import Fields +from .freeEnergy import FreeEnergyValueType from .helpers import boostVelocity from .polynomial import Polynomial @@ -23,6 +24,56 @@ class PhaseInfo: """Temperature of transition.""" +@dataclass +class FreeEnergyArrays: + """Object containing temperatures, positions of the minimum and value of the effective potential. + """ + + temperatures: np.ndarray[float] # 1D array + """Array of temperatures.""" + + freeEnergyList: np.ndarray[FreeEnergyValueType] # 1D array of FreeEnergyValueType objects + """Array of field(s) and potential value at the minimum.""" + + allowedDiscrepancy: float | None + """Allowed discrepancy between the effective potential at the minimum and the user-provided value""" + + def __init__( + self, + temperatures: np.ndarray[float], + minimumList: np.ndarray[float], + potentialEffList: np.ndarray[float], + allowedDiscrepancy: float | None = None, + ) -> None: + """Initialisation of FreeEnergyArrays, based on passing 3 arrays + and a float. """ + temperatures = np.asarray(temperatures) + minimumList = np.asarray(minimumList) + potentialEffList = np.asarray(potentialEffList) + + if temperatures.ndim != 1: + raise ValueError("temperatures must be a 1D array.") + if temperatures.shape[0] != minimumList.shape[0]: + raise ValueError( + "The temperatures and minimumList must have the same length." + ) + if temperatures.shape[0] != potentialEffList.shape[0]: + raise ValueError( + "The temperatures and potentialEffList must have the same length." + ) + if allowedDiscrepancy is not None and allowedDiscrepancy < 0: + raise ValueError("allowedDiscrepancy must not be negative.") + + self.temperatures = temperatures + self.freeEnergyList = FreeEnergyValueType.fromArray( + np.concatenate( + (minimumList, potentialEffList[:, np.newaxis]), axis=1, + ) + ) + self.allowedDiscrepancy = allowedDiscrepancy + + + @dataclass class WallParams: """ diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index ec5b0536..49bda8b6 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -182,7 +182,7 @@ def findWallVelocityDeflagrationHybrid( logging.warning( """\n Warning: vmax is limited by the maximum temperature chosen in the phase tracing. WallGo might be unable to find the wall velocity. - Try increasing the maximum temperature! \n""" + Consider increasing the maximum temperature if no velocity is found. \n""" ) return self.solveWall(vmin, vmax, wallParams) diff --git a/src/WallGo/exceptions.py b/src/WallGo/exceptions.py index 4c9fcae1..e8295d60 100644 --- a/src/WallGo/exceptions.py +++ b/src/WallGo/exceptions.py @@ -3,7 +3,6 @@ """ import typing -from .containers import PhaseInfo class WallGoError(Exception): diff --git a/src/WallGo/freeEnergy.py b/src/WallGo/freeEnergy.py index 7cce8f8c..6d7666b8 100644 --- a/src/WallGo/freeEnergy.py +++ b/src/WallGo/freeEnergy.py @@ -2,21 +2,25 @@ Class that does phase tracing, computes the effective potential in the minimum and interpolate it. """ + from dataclasses import dataclass import logging import numpy as np import scipy.integrate as scipyint import scipy.linalg as scipylinalg +from typing import Union + +# from .containers import FreeEnergyArrays +from .effectivePotential import EffectivePotential +from .exceptions import WallGoError +from .fields import FieldPoint, Fields from .interpolatableFunction import ( InterpolatableFunction, EExtrapolationType, inputType, outputType, ) -from .effectivePotential import EffectivePotential -from .exceptions import WallGoError -from .fields import FieldPoint, Fields @dataclass @@ -163,9 +167,9 @@ def __call__( "Trying to evaluate FreeEnergy outside of its range of existence" ) raise WallGoError( - """\n Trying to evaluate FreeEnergy outside of its allowed range, + """\n Trying to evaluate FreeEnergy outside of its allowed range, try increasing/decreasing Tmax/Tmin.""" - ) + ) def _functionImplementation(self, temperature: inputType | float) -> outputType: """ @@ -254,7 +258,7 @@ def tracePhase( .. math:: \frac{\partial^2 V^\text{eff}}{\partial \phi_i \partial \phi_j}\bigg|_{\phi=\phi^\text{min}} \frac{\partial \phi^\text{min}_j}{\partial T} + \frac{\partial^2 V^\text{eff}}{\partial \phi_i \partial T}\bigg|_{\phi=\phi^\text{min}} = 0, - + starting from a solution at the starting temperature. It uses `scipy.integrate.solve_ivp` to solve the problem. Stops if a mass squared goes through zero. Parameters @@ -383,8 +387,10 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: TList.size > 0 and ode.t == TList[-1] ): logging.warning( - f"Step size {ode.step_size} shrunk too small at T={ode.t}, " - f"vev={ode.y}" + "Step size %g shrunk too small at T=%g, vev=%g", + ode.step_size, + ode.t, + ode.y, ) break # append results to lists @@ -442,3 +448,67 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: # Now to construct the interpolation result = np.concatenate((fieldFullList, potentialEffFullList), axis=1) self.newInterpolationTableFromValues(TFullList, result) + + def constructInterpolationFromArray( + self, + freeEnergyArrays: "FreeEnergyArrays", + dT: float, + ) -> None: + """ + Constructs the interpolation table directly from arrays of temperatures, + field values, and potential values, bypassing the phase tracing process. + + Parameters + ---------- + freeEnergyArrays : FreeEnergyArrays + Object containing arrays of the temperature, minimum and value of the free energy. + dT : float + Small step in temperature used in derivatives, used here to ensure endpoints of temperature range not exceeded when taking derivatives later. + """ + if freeEnergyArrays.allowedDiscrepancy is None: + freeEnergyArrays.allowedDiscrepancy = self.effectivePotential.effectivePotentialError + + freeEnergyList = freeEnergyArrays.freeEnergyList + + # Check if the loaded value is consistent with the effective potential + discrepancies = abs( + freeEnergyList.veffValue - self.effectivePotential.evaluate( + freeEnergyList.fieldsAtMinimum, freeEnergyArrays.temperatures + ) + ) + # Norm includes neighbouring points to avoid division by zero + discrepancyNorm = np.concatenate( + ([0.5 * (abs(freeEnergyList.veffValue[0]) + abs(freeEnergyList.veffValue[1]))], + 0.5 * (abs(freeEnergyList.veffValue[:-1]) + abs(freeEnergyList.veffValue[1:]))) + ) + maxDiscrepancy = max(discrepancies / discrepancyNorm) + if (maxDiscrepancy > freeEnergyArrays.allowedDiscrepancy): + raise WallGoError( + f"The loaded phase disagrees with the effective potential at {maxDiscrepancy:g}, higher than the required precision of {freeEnergyArrays.allowedDiscrepancy:g}." + ) + + # Check that the provided array has sufficiently small temperature steps + maxTemperatureStep = max(abs( + freeEnergyArrays.temperatures[:-1]-freeEnergyArrays.temperatures[1:] + )) + + if maxTemperatureStep > dT: + logging.warning( + "The maximum temperature step size %g is larger than the maximum step size %g. " + "This may lead to inaccurate interpolation.", + maxTemperatureStep, + dT, + ) + + self.minPossibleTemperature[0] = min(freeEnergyArrays.temperatures) + 2 * dT + self.maxPossibleTemperature[0] = max(freeEnergyArrays.temperatures) - 2 * dT + + # Concatenate field values and potential into a single array (N, nFields + 1) + resultArray = np.concatenate( + (freeEnergyList.fieldsAtMinimum, freeEnergyList.veffValue[:, np.newaxis]), axis=1 + ) + + # Construct the interpolation table + self.newInterpolationTableFromValues( + freeEnergyArrays.temperatures, resultArray + ) diff --git a/src/WallGo/hydrodynamicsTemplateModel.py b/src/WallGo/hydrodynamicsTemplateModel.py index 307faa34..53002262 100644 --- a/src/WallGo/hydrodynamicsTemplateModel.py +++ b/src/WallGo/hydrodynamicsTemplateModel.py @@ -99,6 +99,7 @@ def __init__( self.vMin = self.minVelocity() self.epsilon = self.wN*(1/self.mu-(1-3*self.alN)/self.nu) + def findJouguetVelocity(self, alN: float | None = None) -> float: r""" Finds the Jouguet velocity, corresponding to the phase transition strength diff --git a/src/WallGo/manager.py b/src/WallGo/manager.py index 15cd7479..18d5cd2d 100644 --- a/src/WallGo/manager.py +++ b/src/WallGo/manager.py @@ -68,7 +68,7 @@ class WallSolver: class WallGoManager: """Manages WallGo program flow - + The WallGoManager is a 'control' class which collects together and manages all the various parts of the WallGo Python package for the computation of the bubble wall velocity. @@ -115,12 +115,14 @@ def setVerbosity(self, verbosityLevel: int) -> None: shown. """ - logging.basicConfig(format='%(message)s', level=verbosityLevel, force=True) + logging.basicConfig(format="%(message)s", level=verbosityLevel, force=True) def setupThermodynamicsHydrodynamics( self, phaseInfo: WallGo.PhaseInfo, veffDerivativeScales: WallGo.VeffDerivativeSettings, + freeEnergyArraysHighT: WallGo.FreeEnergyArrays = None, + freeEnergyArraysLowT: WallGo.FreeEnergyArrays = None, ) -> None: r"""Must run before :py:meth:`solveWall()` and companions. Initialization of internal objects related to equilibrium thermodynamics and @@ -158,7 +160,10 @@ def setupThermodynamicsHydrodynamics( # Checks that phase input makes sense with the user-specified Veff self.validatePhaseInput(phaseInfo) - self.initTemperatureRange() + self.initTemperatureRange( + freeEnergyArraysHighT=freeEnergyArraysHighT, + freeEnergyArraysLowT=freeEnergyArraysLowT, + ) ## Should we write these to a result struct? logging.info("Temperature ranges:") @@ -277,11 +282,24 @@ def validatePhaseInput(self, phaseInput: PhaseInfo) -> None: self.phasesAtTn = foundPhaseInfo - def initTemperatureRange(self) -> None: + def initTemperatureRange( + self, + freeEnergyArraysHighT: WallGo.FreeEnergyArrays = None, + freeEnergyArraysLowT: WallGo.FreeEnergyArrays = None, + ) -> None: """ Determine the relevant temperature range and trace the phases over this range. Interpolate the free energy in both phases and store in internal thermodynamics object. + + Parameters + ---------- + freeEnergyArraysHighT : WallGo.FreeEnergyArrays, optional + If provided, use these arrays to initialize the high-T free energy object. + If None, the phase will be traced. + freeEnergyArraysLowT : WallGo.FreeEnergyArrays, optional + If provided, use these arrays to initialize the low-T free energy object. + If None, the phase will be traced. """ assert self.phasesAtTn is not None @@ -308,7 +326,9 @@ def initTemperatureRange(self) -> None: # required temperature. We do not solve hydrodynamics inside the bubble, so # we are only interested in T- (the temperature right at the wall). hydrodynamicsTemplate = HydrodynamicsTemplateModel(self.thermodynamics) - logging.info(f"vwLTE in the template model: {hydrodynamicsTemplate.findvwLTE()}") + logging.info( + f"vwLTE in the template model: {hydrodynamicsTemplate.findvwLTE()}" + ) except WallGoError as error: # Throw new error with more info @@ -323,6 +343,56 @@ def initTemperatureRange(self) -> None: "positive." ) + phaseTracerTol = self.config.configThermodynamics.phaseTracerTol + # Estimate of the dT needed to reach the desired tolerance considering + # the error of a cubic spline scales like dT**4. + dT = ( + self.model.getEffectivePotential().derivativeSettings.temperatureVariationScale + * phaseTracerTol**0.25 + ) + + # Construct high and low temperature free energy objects + fHighT = self.thermodynamics.freeEnergyHigh + fLowT = self.thermodynamics.freeEnergyLow + + # Try to construct interpolations if arrays are given + loadedHigh = False + loadedLow = False + + if freeEnergyArraysHighT is not None: + # If the user provided free energy arrays, use them to initialize the + # free energy objects. + try: + fHighT.constructInterpolationFromArray( + freeEnergyArraysHighT, + dT, + ) + loadedHigh = True + logging.info("Using user-provided high-T free energy arrays.") + except (ValueError, WallGoError) as e: + raise WallGoError( + f"Failed to load high-T free energy arrays: \n {e}" + ) from e + + if freeEnergyArraysLowT is not None: + # If the user provided free energy arrays, use them to initialize the + # free energy objects. + try: + fLowT.constructInterpolationFromArray( + freeEnergyArraysLowT, + dT, + ) + loadedLow = True + logging.info("Using user-provided low-T free energy arrays.") + except (ValueError, WallGoError) as e: + raise WallGoError( + f"Failed to load high-T free energy arrays: \n {e}" + ) from e + + # If the user did not provide free energy arrays, we trace the phases + if loadedHigh and loadedLow: + return + # Maximum values for T+ and T- are reached at the Jouguet velocity _, _, THighTMaxTemplate, TLowTMaxTemplate = hydrodynamicsTemplate.findMatching( 0.99 * hydrodynamicsTemplate.vJ @@ -340,15 +410,6 @@ def initTemperatureRange(self) -> None: if TLowTMinTemplate is None: TLowTMinTemplate = self.config.configHydrodynamics.tmin * Tn - phaseTracerTol = self.config.configThermodynamics.phaseTracerTol - - # Estimate of the dT needed to reach the desired tolerance considering - # the error of a cubic spline scales like dT**4. - dT = ( - self.model.getEffectivePotential().derivativeSettings.temperatureVariationScale - * phaseTracerTol**0.25 - ) - """Since the template model is an approximation of the full model, and since the temperature profile in the wall could be non-monotonous, we should not take exactly the TMin and TMax from the template model. @@ -360,24 +421,23 @@ def initTemperatureRange(self) -> None: TMinLowT = TLowTMinTemplate * self.config.configThermodynamics.tmin TMaxLowT = TLowTMaxTemplate * self.config.configThermodynamics.tmax - # Interpolate phases and check that they remain stable in this range - fHighT = self.thermodynamics.freeEnergyHigh - fLowT = self.thermodynamics.freeEnergyLow - - fHighT.tracePhase( - TMinHighT, - TMaxHighT, - dT, - rTol=phaseTracerTol, - phaseTracerFirstStep=self.config.configThermodynamics.phaseTracerFirstStep, - ) - fLowT.tracePhase( - TMinLowT, - TMaxLowT, - dT, - rTol=phaseTracerTol, - phaseTracerFirstStep=self.config.configThermodynamics.phaseTracerFirstStep, - ) + # Only trace if the corresponding file wasn't loaded + if not loadedHigh: + fHighT.tracePhase( + TMinHighT, + TMaxHighT, + dT, + rTol=phaseTracerTol, + phaseTracerFirstStep=self.config.configThermodynamics.phaseTracerFirstStep, + ) + if not loadedLow: + fLowT.tracePhase( + TMinLowT, + TMaxLowT, + dT, + rTol=phaseTracerTol, + phaseTracerFirstStep=self.config.configThermodynamics.phaseTracerFirstStep, + ) def setPathToCollisionData(self, directoryPath: pathlib.Path) -> None: """ @@ -418,7 +478,7 @@ def solveWall( ) -> WallGoResults: r""" Solves for the wall velocity - + Solves the coupled scalar equation of motion and the Boltzmann equation. Must be ran after :py:meth:`analyzeHydrodynamics()` because the solver depends on thermodynamical and hydrodynamical @@ -529,7 +589,9 @@ def setupWallSolver(self, wallSolverSettings: WallSolverSettings) -> WallSolver: # Factor that multiplies the collision term in the Boltzmann equation. collisionMultiplier = self.config.configBoltzmannSolver.collisionMultiplier - truncationOption = ETruncationOption[self.config.configBoltzmannSolver.truncationOption] + truncationOption = ETruncationOption[ + self.config.configBoltzmannSolver.truncationOption + ] # Hardcode basis types here: Cardinal for z, Chebyshev for pz, pp boltzmannSolver = BoltzmannSolver( grid, @@ -593,13 +655,17 @@ def buildGrid( gridM = self.config.configGrid.spatialGridSize ratioPointsWall = self.config.configGrid.ratioPointsWall smoothing = self.config.configGrid.smoothing - + Tnucl = self.phasesAtTn.temperature # We divide by Tnucl to get it in physical units of length - tailLength = max( - meanFreePathScale, 0.5 * wallThicknessIni * (1.0 + 3.0 * smoothing) / ratioPointsWall - ) / Tnucl + tailLength = ( + max( + meanFreePathScale, + 0.5 * wallThicknessIni * (1.0 + 3.0 * smoothing) / ratioPointsWall, + ) + / Tnucl + ) if gridN % 2 == 0: raise ValueError( @@ -619,7 +685,10 @@ def buildGrid( ) def buildEOM( - self, grid: Grid3Scales, boltzmannSolver: BoltzmannSolver, meanFreePathScale: float + self, + grid: Grid3Scales, + boltzmannSolver: BoltzmannSolver, + meanFreePathScale: float, ) -> EOM: r""" Constructs an :py:class:`EOM` object using internal state from the :py:class:`WallGoManager`, @@ -651,7 +720,7 @@ def buildEOM( wallThicknessBounds = self.config.configEOM.wallThicknessBounds wallOffsetBounds = self.config.configEOM.wallOffsetBounds - + Tnucl = self.phasesAtTn.temperature return EOM( @@ -660,7 +729,7 @@ def buildEOM( self.hydrodynamics, grid, numberOfFields, - meanFreePathScale / Tnucl, # We divide by Tnucl to get physical units + meanFreePathScale / Tnucl, # We divide by Tnucl to get physical units wallThicknessBounds, wallOffsetBounds, includeOffEq=True, @@ -670,4 +739,3 @@ def buildEOM( maxIterations=maxIterations, pressRelErrTol=pressRelErrTol, ) - diff --git a/src/WallGo/results.py b/src/WallGo/results.py index ef8c58da..b9f4141c 100644 --- a/src/WallGo/results.py +++ b/src/WallGo/results.py @@ -176,7 +176,7 @@ class WallGoResults: :math:`|P[\delta f]| / |P[f_\text{eq}]|`.""" eomResidual: np.ndarray - """ + r""" Residual of the EOM due to the tanh ansatz. There is one element for each scalar field. It is estimated by the integral diff --git a/tests/Benchmarks/SingletSM_Z2/test_FreeEnergy.py b/tests/Benchmarks/SingletSM_Z2/test_FreeEnergy.py index e96e0a65..332a31b9 100644 --- a/tests/Benchmarks/SingletSM_Z2/test_FreeEnergy.py +++ b/tests/Benchmarks/SingletSM_Z2/test_FreeEnergy.py @@ -2,7 +2,7 @@ import numpy as np from typing import Tuple -from tests.BenchmarkPoint import BenchmarkPoint +from tests.BenchmarkPoint import BenchmarkPoint, BenchmarkModel import WallGo @@ -11,7 +11,7 @@ def test_freeEnergy_singletSimple( singletSimpleBenchmarkFreeEnergy: Tuple[WallGo.FreeEnergy, WallGo.FreeEnergy, BenchmarkPoint], T: float, -): +) -> None: """ Testing numerics of FreeEnergy """ @@ -47,3 +47,77 @@ def test_freeEnergy_singletSimple( assert vExact == pytest.approx(v, rel=rTol) assert 0 == pytest.approx(x, abs=aTol) assert f0 + VvExact == pytest.approx(veffValue, rel=rTol) + + +def test_freeEnergy_singletSimple_passingArrays( + singletSimpleBenchmarkModel: BenchmarkModel, + singletSimpleBenchmarkFreeEnergy: Tuple[WallGo.FreeEnergy, WallGo.FreeEnergy, BenchmarkPoint], +) -> None: + """ + Testing building FreeEnergy from passing arrays + """ + freeEnergy1, freeEnergy2, BM = singletSimpleBenchmarkFreeEnergy + + # temperature range + temperatureRange = np.linspace(90, 110, num=50) + nT = len(temperatureRange) + + vList = np.zeros((nT, 2)) + vVeffList = np.zeros(nT) + xList = np.zeros((nT, 2)) + xVeffList = np.zeros(nT) + + # tolerance + tol = 1e-15 + + for iT, T in enumerate(temperatureRange): + # exact results + thermalParameters = freeEnergy1.effectivePotential.getThermalParameters(T) + f0 = -107.75 * np.pi ** 2 / 90 * T ** 4 + + vExact = np.sqrt(-thermalParameters["muHsq"] / thermalParameters["lHH"]) + VvExact = -0.25 * thermalParameters["muHsq"] ** 2 / thermalParameters["lHH"] + vList[iT, 0] = vExact + vVeffList[iT] = f0 + VvExact + + xExact = np.sqrt(-thermalParameters["muSsq"] / thermalParameters["lSS"]) + VxExact = -0.25 * thermalParameters["muSsq"] ** 2 / thermalParameters["lSS"] + + xList[iT, 1] = xExact + xVeffList[iT] = f0 + VxExact + + freeEnergyHighT = WallGo.FreeEnergyArrays( + temperatures=temperatureRange, + minimumList=xList, + potentialEffList=xVeffList, + allowedDiscrepancy=tol, + ) + + freeEnergyLowT = WallGo.FreeEnergyArrays( + temperatures=temperatureRange, + minimumList=vList, + potentialEffList=vVeffList, + allowedDiscrepancy=tol, + ) + + # free energies for both phases + freeEnergy1 = WallGo.FreeEnergy( + singletSimpleBenchmarkModel.model.getEffectivePotential(), + temperatureRange[10], + WallGo.Fields(vList[10]), + ) + freeEnergy2 = WallGo.FreeEnergy( + singletSimpleBenchmarkModel.model.getEffectivePotential(), + temperatureRange[10], + WallGo.Fields(xList[10]), + ) + + freeEnergy1.constructInterpolationFromArray( + freeEnergyArrays=freeEnergyLowT, + dT=abs(temperatureRange[1]-temperatureRange[0]) + ) + + freeEnergy2.constructInterpolationFromArray( + freeEnergyArrays=freeEnergyHighT, + dT=abs(temperatureRange[1]-temperatureRange[0]) + ) From e929b36495def5e3f8240ac3b18d647e5289df85 Mon Sep 17 00:00:00 2001 From: benoitlaurent96 <132939700+benoitlaurent96@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:32:22 -0400 Subject: [PATCH 06/24] Merge pull request #20 from Wall-Go/fixPhaseTracing2 Fix phase tracing2 --- .../inertDoubletModelConfig.ini | 3 + .../scanResults/BM1_05v_top.npy | Bin 0 -> 3623 bytes .../scanResults/BM3_05v_top.npy | Bin 0 -> 5081 bytes Models/ManySinglets/manySingletsConfig.ini | 3 + .../singletStandardModelZ2Config.ini | 3 + Models/StandardModel/standardModelConfig.ini | 3 + src/WallGo/config.py | 11 +++ src/WallGo/effectivePotential.py | 5 +- src/WallGo/equationOfMotion.py | 24 +++-- src/WallGo/freeEnergy.py | 92 +++++++++++++++--- src/WallGo/interpolatableFunction.py | 63 +++++++++--- src/WallGo/manager.py | 13 ++- tests/Benchmarks/SingletSM_Z2/conftest.py | 21 ++-- 13 files changed, 194 insertions(+), 47 deletions(-) create mode 100644 Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy create mode 100644 Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy diff --git a/Models/InertDoubletModel/inertDoubletModelConfig.ini b/Models/InertDoubletModel/inertDoubletModelConfig.ini index 0f1bfa96..6d1cc286 100644 --- a/Models/InertDoubletModel/inertDoubletModelConfig.ini +++ b/Models/InertDoubletModel/inertDoubletModelConfig.ini @@ -83,6 +83,9 @@ phaseTracerTol = 1e-8 # First step size in units of the maximum step size. Use None for default algorithm. phaseTracerFirstStep = None +# Degree of the splines used in FreeEnergy to interpolate the potential and its derivatives. +interpolationDegree = 1 + [BoltzmannSolver] # Factor multiplying the collision term in the Boltzmann equation. # Can be used for testing or for studying the solution's sensibility diff --git a/Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy b/Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy new file mode 100644 index 0000000000000000000000000000000000000000..a3ddba06732ef7882b42579a1da047fa7032b6f5 GIT binary patch literal 3623 zcmbu>X?zq#8VBGB;Rqv#N;nJ(;c^lTfh0td2oxcN267N9i3TrrjwU@Y%*P(+h+I(C3f$0A92Zic%t1CklA=ZvHNA# zPsm70Op33H|9?K#$D*Cy;B5cgWT%hF$+LqV>b4VNpKF~?WT(#?pd{#|R5-w0rEt3OyA48E0fb zEPuwH7f|h?io#UVceKbdyX0 zL5>O&Fyt!N6P(C_B@B}c;K|_xr|<;xFyxyjSilop>!V}vm>mcTDNGd;ED9xfFE4;G z6dMIflzcJ4QVRE(BzV7K#$KkMrsJ3gEbcY+2&Sp<0EP!m*dNkY9-rTG@KC=?W8q;H z9>FkOVE;n|yPdH+M0TfylyfJy4*g0I*j*AjQ`)*AZo;e(yDXt&N7HKePo5LOK0`0x zuXjz6dz~Laxe5vfcbI)9SDA&uW2npyvwJza4};&F9XNZ@cizsvg)ImOg@DLTL+n9b zpaMgsQDBbZ7un}h_@fE?qo(Zh^wa!Oo4NmqQBNVLQei%Z1t#o|=_|`VJu+@}V>E(= zDlEcKEwDcx!Cu4IRgt|`LY^m=I=xr73G8(eI@@k#-RMA%5PQ9Zj*pyHm42-*f_<@G ze%Suq*79N>f+tj1g5k+9`%GIo6EE-#hSf%aHA;iX{w#&HChY4>+5fDc=JHRYeX*&H2-d6c9EQJ`uy4>;HeE`r zZaUK)!SgD-fMKJ+{$d3CON{+xk^L13`7;-9JmwlMuy11Qlh6OSH|>0g{Z$E_P|}Nw znx{vwZ`RAVF70^Xp6wn4uc^?C;q@^48(d`zhBpnBtzq`JIQupX+s)ZqID6{RDKTpv z+=}3B3h#*QJ3{O`d4XLRb{hrWRkn-ldnoKRVSmq*y;VO=U4~`L@YAai>{H==41YCY z->{;?->4J6ga1}iR|Yo{L_T}U#9F|>ZghQHa(}OZ9Reu zDtv|EYZLZ=>nq1rPq}F z`>&W-*u~IPoXyte_7u53sp-B^oBch=sR z6uJ5OuKp{E%P+PiB65qi>sD=7559|Ef3=GciRE2>qc!eAq$e8)R*_!pONfv3W_<}& zs5?s=K4}goNcw2wXRo~O$trLgA(Gp)!L|j``#F=B5>p<=`jjNI)+FWOY}hpA z5qv^R`Ou_&`%2$`5s?%&q>@zDVv@#MlaxnZ-_`a-^N>BQDTt(NyYAL@jpDn)DQEDm Qm~ti?2+EXXv2RE6Z{t3cX8-^I literal 0 HcmV?d00001 diff --git a/Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy b/Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy new file mode 100644 index 0000000000000000000000000000000000000000..f1837d97f9bcbf5f9da972a43e69389acae725eb GIT binary patch literal 5081 zcmbuCd0Z4n7Jxw%aMVP_3lk9}3SK05pHvKBiy&f&iU*ou7#R?OSJML?fJUVem6+g# z7x9YG&8~??BZ?S|#<* zS{K}--3p*VxO)HNCTxb#-8$0q3{82+Rk)df)Q6e-8&VyHi6B^+fV|tdw2(L;c&ZqiN;{Nt(F*_$F zJ`$Qs$&uTKJ8<_!oEZP~T z4}ezujIAlOah!1ov~@kBn+)xe!o3R)r?l!$tOR@&Xiwoa^?_pGb&H!t<HgLXcxXFdxvB zLO1(>?v_B@hfl5kKo1#uCM7h*#G09IlT$M@;?V|#n38O%C^*AvNHNPsS;ohI(=@@D zo-SpEFtZiqTMdz8g)IhnOZ}LL$l)==BswfUYIH1wD$t8U?}TRf`RS<{;Ve})Gn^3$ zeJnnfHsRiW6RSRJes4U1z6$iC(Ep{CyDu_z(t8(+$KkI}iUJl2sZQ)^oXQLe>2@kJo!B!t_Dl*{`q+VEAJXBI z>hW<^1egp~5xeZbZsP;8DdgA(%(7&O*k{WyM+f^{UF^Bq)0|I?_3pean?Rld`4r~q zV4tt8j0+v|w6<||7`&&z0tyQS?2BBm7a(>;#9k*;R8FB51rUcIQA73R_bG4 z#j$t3xuc-XjY|b*1`ze&`V?V&L=jL8{5;3oWz(E-*MC^wg*em&f!xX-<52&(~i`b9I@U;&1qq^9S zX-{))ZpVXJdlUlSC~%y@w>sEQXe%op9Fus@MVU7)8SPU`2t{;NbTOr2CwySyY2~t>N%<+8)X=5+KTBy5Ps=IvnF8=zfz6h~aJmqh+ z_IDxH8Vj~O)&?(vKGqgl}}dvdf!L% z$l7B^d!)82<_wCxK7+8=u%xipF;donw;iuZ%#UZtxTD(h$7p99z#EPiYt{)fRLla^ zWpAjUZ5;Tsq>n)h!6? ztM2Nj?&{BXIV}(1sc3m17SQq_yoi}FYlqaHPf+dB$jghipyj^ek9iAcMaJ3hK(at!MH|i}9$BbK+ z)MX>oWqOvQu){68H7Shh*KsdlBe5W}XkHd9$6)TTJc{4r31aa|*=UUR6U5W10W!r|pV}h#K_sKwrY} zzj@p>N!>M>?{Zq6!c)<5A{Nl{RJ@3mr(rIUtgEFB?ky=1EWfMP>&ox$oYXweVcDn_ zFL(86*?X43<##y=JKEu%4wgvUZmEQsu%xhLjFg#qyWaA2o+0BDwP(R-XPn9#^_J5x z>k20upqNcUKT88VeYUD{2ouh@Jg8#qx}Rj-lp+U zqGcQAGRwxOV>t)Qx|V10hHBZ={#o^@)0+sJjU|Q6!ARL$j5?Nc>vsjNIa+wSG=Q)? zbyvQ+YaZX_v^<}uqUHCnfR-2FMYOySbBVCSC5@-es1z(OQtNfs4<`FewKyynsKv_< z4u7|(%|I8+3U;(ddeN$H?ValBgcV{*VT&a%&mY47h8820P%P`s*7xPBF<@Yh; zmY1u`K2VqGS^f|^-137KsXJ4a?Ix@Q3o={5%Yx;Vm^&=5;`exh)p(_B4MzJ3O7S+0 zj}k4f#aw3VFzQ%dk7ZrU8+b#t9O<=pz|GrR3EPMzg_U8X>?4dimN(V!>K{jax3vr= fY_qy+i@Iwo-{rKtji;jJkFj7g%WOMdlS2LrE8QDD literal 0 HcmV?d00001 diff --git a/Models/ManySinglets/manySingletsConfig.ini b/Models/ManySinglets/manySingletsConfig.ini index 16065aa6..d4acd53b 100644 --- a/Models/ManySinglets/manySingletsConfig.ini +++ b/Models/ManySinglets/manySingletsConfig.ini @@ -83,6 +83,9 @@ phaseTracerTol = 1e-6 # First step size in units of the maximum step size. Use None for default algorithm. phaseTracerFirstStep = None +# Degree of the splines used in FreeEnergy to interpolate the potential and its derivatives. +interpolationDegree = 1 + [BoltzmannSolver] # Factor multiplying the collision term in the Boltzmann equation. # Can be used for testing or for studying the solution's sensibility diff --git a/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini b/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini index 5c529cc4..57393798 100644 --- a/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini +++ b/Models/SingletStandardModel_Z2/singletStandardModelZ2Config.ini @@ -83,6 +83,9 @@ phaseTracerTol = 1e-6 # First step size in units of the maximum step size. Use None for default algorithm. phaseTracerFirstStep = None +# Degree of the splines used in FreeEnergy to interpolate the potential and its derivatives. +interpolationDegree = 1 + [BoltzmannSolver] # Factor multiplying the collision term in the Boltzmann equation. # Can be used for testing or for studying the solution's sensibility diff --git a/Models/StandardModel/standardModelConfig.ini b/Models/StandardModel/standardModelConfig.ini index 8a1bd1c4..33c3be7c 100644 --- a/Models/StandardModel/standardModelConfig.ini +++ b/Models/StandardModel/standardModelConfig.ini @@ -83,6 +83,9 @@ phaseTracerTol = 1e-6 # First step size in units of the maximum step size. Use None for default algorithm. phaseTracerFirstStep = None +# Degree of the splines used in FreeEnergy to interpolate the potential and its derivatives. +interpolationDegree = 1 + [BoltzmannSolver] # Factor multiplying the collision term in the Boltzmann equation. # Can be used for testing or for studying the solution's sensibility diff --git a/src/WallGo/config.py b/src/WallGo/config.py index b51a172f..2bc26006 100644 --- a/src/WallGo/config.py +++ b/src/WallGo/config.py @@ -119,6 +119,12 @@ class ConfigThermodynamics: uses the initial step size algorithm of :py:mod:`scipy.integrate.solve_ivp`. """ + interpolationDegree: int = 1 + """ + Degree of the splines used in FreeEnergy to interpolate the potential and its + derivatives. + """ + @dataclass class ConfigBoltzmannSolver: """ Holds the config of the BoltzmannSolver class. """ @@ -285,6 +291,11 @@ def loadConfigFromFile(self, filePath: str) -> None: self.configThermodynamics.phaseTracerFirstStep = None else: raise + if 'interpolationDegree' in keys: + self.configThermodynamics.interpolationDegree = parser.getint( + "Thermodynamics", + "interpolationDegree" + ) # Read the BoltzmannSolver configs if 'BoltzmannSolver' in parser.sections(): diff --git a/src/WallGo/effectivePotential.py b/src/WallGo/effectivePotential.py index 838af60d..b142a212 100644 --- a/src/WallGo/effectivePotential.py +++ b/src/WallGo/effectivePotential.py @@ -120,7 +120,8 @@ def getInherentRelativeError(self) -> float: return self.effectivePotentialError - def findLocalMinimum(self, initialGuess: Fields, temperature: npt.ArrayLike, tol: float = None) -> Tuple[Fields, np.ndarray]: + def findLocalMinimum(self, initialGuess: Fields, temperature: npt.ArrayLike, + tol: float = None, method: str|None = None) -> Tuple[Fields, np.ndarray]: """ Finds a local minimum starting from a given initial configuration of background fields. Feel free to override this if your model requires more delicate minimization. @@ -159,7 +160,7 @@ def evaluateWrapper(fieldArray: np.ndarray): guess = guesses.getFieldPoint(i) - res = scipy.optimize.minimize(evaluateWrapper, guess, tol=tol) + res = scipy.optimize.minimize(evaluateWrapper, guess, tol=tol, method=method) resLocation[i] = res.x resValue[i] = res.fun diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 49bda8b6..9f3a7cbc 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -135,6 +135,9 @@ def __init__( self.successTemperatureProfile = True ## Flag to detect if we were able to find the pressure self.successWallPressure = True + + # also getting the LTE results + self.wallVelocityLTE = self.hydrodynamics.findvwLTE() def findWallVelocityDeflagrationHybrid( self, wallThicknessIni: float | None = None @@ -185,7 +188,15 @@ def findWallVelocityDeflagrationHybrid( Consider increasing the maximum temperature if no velocity is found. \n""" ) - return self.solveWall(vmin, vmax, wallParams) + results = self.solveWall(vmin, vmax, wallParams) + if (results.solutionType != ESolutionType.DEFLAGRATION and + 0 < self.wallVelocityLTE < 1 and + self.includeOffEq): + # If there is a LTE solution but no out-of-equilibrium one, retry with vmax + # set to the LTE velocity. + results = self.solveWall(vmin, self.wallVelocityLTE, wallParams) + + return results def findWallVelocityDetonation( self, @@ -451,15 +462,12 @@ def solveWall( hydroResultsMax, ) = wallPressureResultsMax - # also getting the LTE results - wallVelocityLTE = self.hydrodynamics.findvwLTE() - # The pressure peak is not enough to stop the wall: no deflagration or # hybrid solution if pressureMax < 0: logging.info("Maximum pressure on wall is negative!") logging.info(f"{pressureMax=} {wallParamsMax=}") - results.setWallVelocities(None, None, wallVelocityLTE) + results.setWallVelocities(None, None, self.wallVelocityLTE) results.setWallParams(wallParamsMax) results.setHydroResults(hydroResultsMax) results.setBoltzmannBackground(boltzmannBackgroundMax) @@ -500,7 +508,7 @@ def solveWall( the phase transition cannot proceed. Something might be wrong with your potential.""" ) - results.setWallVelocities(None, None, wallVelocityLTE) + results.setWallVelocities(None, None, self.wallVelocityLTE) results.setWallParams(wallParamsMin) results.setHydroResults(hydroResultsMin) results.setBoltzmannBackground(boltzmannBackgroundMin) @@ -601,7 +609,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name if self.includeOffEq: finiteDifferenceBoltzmannResults = self.getBoltzmannFiniteDifference() # assuming nonequilibrium errors proportional to deviation from LTE - wallVelocityDeltaLTE = abs(wallVelocity - wallVelocityLTE) + wallVelocityDeltaLTE = abs(wallVelocity - self.wallVelocityLTE) # the truncation error in the spectral method within Boltzmann wallVelocityTruncationError = ( boltzmannResults.truncationError * wallVelocityDeltaLTE @@ -632,7 +640,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name results.setWallVelocities( wallVelocity=wallVelocity, wallVelocityError=wallVelocityError, - wallVelocityLTE=wallVelocityLTE, + wallVelocityLTE=self.wallVelocityLTE, ) results.setHydroResults(hydroResults) diff --git a/src/WallGo/freeEnergy.py b/src/WallGo/freeEnergy.py index 6d7666b8..f525e403 100644 --- a/src/WallGo/freeEnergy.py +++ b/src/WallGo/freeEnergy.py @@ -250,6 +250,7 @@ def tracePhase( spinodal: bool = True, # Stop tracing if a mass squared turns negative paranoid: bool = True, # Re-solve minimum after every step phaseTracerFirstStep: float | None = None, # Starting step + interpolationDegree: int = 1, ) -> None: r"""Traces minimum of potential @@ -277,6 +278,9 @@ def tracePhase( If True, re-solve minimum after every step. The default is True. phaseTracerFirstStep : float or None, optional If a float, this gives the starting step size in units of the maximum step size :py:data:`dT`. If :py:data:`None` then uses the initial step size algorithm of :py:mod:`scipy.integrate.solve_ivp`. Default is :py:data:`None` + interpolationDegree : int, optional + Degree of the splines used in FreeEnergy to interpolate the potential and + its derivatives. Default is 1. """ # make sure the initial conditions are extra accurate extraTol = 0.01 * rTol @@ -300,17 +304,14 @@ def odeFunction(temperature: float, field: np.ndarray) -> np.ndarray: ) return np.asarray(scipylinalg.solve(hess, -dgraddT, assume_a="sym")) - # finding some sensible mass scales - ddVT0 = self.effectivePotential.deriv2Field2(phase0, T0) - eigsT0 = np.linalg.eigvalsh(ddVT0) - # mass_scale_T0 = np.mean(eigs_T0) - # min_mass_scale = rTol * mass_scale_T0 - # mass_hierarchy_T0 = min(eigs_T0) / max(eigs_T0) - # min_hierarchy = rTol * mass_hierarchy_T0 + # compute all the second derivatives at the beginning of phase tracing + d2Vdphi2, d2VdphidT, d2VdT2 = self.effectivePotential.allSecondDerivatives( + phase0, T0) + eigsT0 = np.linalg.eigvalsh(d2Vdphi2) # checking stable phase at initial temperature assert ( - min(eigsT0) * max(eigsT0) > 0 + min(eigsT0) > 0 ), "tracePhase error: unstable at starting temperature" def spinodalEvent(temperature: float, field: np.ndarray) -> float: @@ -320,12 +321,17 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: d2V = self.effectivePotential.deriv2Field2(FieldPoint(field), temperature) eigs = scipylinalg.eigvalsh(d2V) return float(min(eigs)) + # arrays to store results TList = np.full(1, T0) fieldList = np.full((1, phase0.numFields()), Fields((phase0,))) potentialEffList = np.full((1, 1), [potential0]) - + dVdTList = np.full((1,1), [self.effectivePotential.derivT(phase0, T0)]) + dphidT = -np.linalg.inv(d2Vdphi2)@d2VdphidT + d2VdT2List = np.full((1,1), [d2VdT2+dphidT@d2VdphidT]) + dphidTList = np.full((1, phase0.numFields()), + Fields((dphidT,))) # maximum temperature range TMin = max(self.minPossibleTemperature[0], TMin) TMax = min(self.maxPossibleTemperature[0], TMax) @@ -352,6 +358,9 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: while ode.status == "running": try: ode.step() + # check if all the eigenvalues of the hessian are positive + if spinodalEvent(ode.t, ode.y) <= 0: + break except RuntimeWarning as error: logging.error(error.args[0] + f" at T={ode.t}") break @@ -362,9 +371,7 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: tol=rTol, ) ode.y = phaset[0] - if spinodalEvent(ode.t, ode.y) <= 0: - break - if not paranoid: + else: # check if extremum is still accurate dVt = self.effectivePotential.derivField(Fields((ode.y)), ode.t) err = np.linalg.norm(dVt) / T0**3 @@ -382,6 +389,14 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: potentialEffT = np.asarray( self.effectivePotential.evaluate(Fields((ode.y)), ode.t) ) + + # Computing all the derivatives along the whole phase tracing + dVdT = self.effectivePotential.derivT(Fields((ode.y)), ode.t) + (d2Vdphi2, + d2VdphidT, + d2VdT2) = self.effectivePotential.allSecondDerivatives( + FieldPoint(ode.y), ode.t) + # check if step size is still okay to continue if ode.step_size < 1e-16 * T0 or ( TList.size > 0 and ode.t == TList[-1] @@ -393,19 +408,51 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: ode.y, ) break + + dphidT = -np.linalg.inv(d2Vdphi2)@d2VdphidT + D2VDT2 = d2VdT2+dphidT@d2VdphidT + + # check that sound speed square is still positive + csq = dVdT/D2VDT2/ode.t + if csq < 0: + break + # Check if 2 methods for computing the 2nd derivative disagree by more + # than a factor of 2. This would indicate a discontinuity caused by a + # phase disappearing. + if TList.size >= 2: + # The first method uses the last value stored in d2VdT2List, which + # computes the total derivative in terms of the partial derivatives + # of V and the field phi. This is the more accurate method. + # The second method takes the finite derivative of dVdT, which + # should break down when the phase disappears because there is a + # discontinuity. + if d2VdT2List[-1,0]*(ode.t-TList[-2])/(dVdT-dVdTList[-2,0]) < 0.5: + break + # append results to lists TList = np.append(TList, [ode.t], axis=0) fieldList = np.append(fieldList, [ode.y], axis=0) potentialEffList = np.append(potentialEffList, [potentialEffT], axis=0) + dVdTList = np.append(dVdTList, [[dVdT]], axis=0) + d2VdT2List = np.append(d2VdT2List, [[D2VDT2]], axis=0) + dphidTList = np.append(dphidTList, + [dphidT], + axis=0) if direction == 0: # populating results array TFullList = TList fieldFullList = fieldList potentialEffFullList = potentialEffList + dVdTFullList = dVdTList + d2VdT2FullList = d2VdT2List + dphidTFullList = dphidTList # making new empty array for downwards integration TList = np.empty(0, dtype=float) fieldList = np.empty((0, phase0.numFields()), dtype=float) potentialEffList = np.empty((0, 1), dtype=float) + dVdTList = np.empty((0, 1), dtype=float) + d2VdT2List = np.empty((0, 1), dtype=float) + dphidTList = np.empty((0, phase0.numFields()), dtype=float) else: if len(TList) > 1: # combining up and down integrations @@ -416,6 +463,13 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: potentialEffFullList = np.append( np.flip(potentialEffList, axis=0), potentialEffFullList, axis=0 ) + dVdTFullList = np.append( + np.flip(dVdTList, axis=0), dVdTFullList, axis=0) + d2VdT2FullList = np.append( + np.flip(d2VdT2List, axis=0), d2VdT2FullList, axis=0) + dphidTFullList = np.append( + np.flip(dphidTList, axis=0), dphidTFullList, axis=0 + ) elif len(TFullList) <= 1: # Both up and down lists are too short raise RuntimeError("Failed to trace phase") @@ -445,9 +499,21 @@ def spinodalEvent(temperature: float, field: np.ndarray) -> float: Try decreasing temperatureVariationScale.""" ) + # Compute the second derivative of the field by finite differences + d2phidT2 = np.zeros_like(dphidTFullList) + d2phidT2[1:-1] = ((dphidTFullList[2:] - dphidTFullList[:-2]) / + (TFullList[2:] - TFullList[:-2])[:,None]) + d2phidT2[0] = ((dphidTFullList[1] - dphidTFullList[0]) / + (TFullList[1] - TFullList[0])) + d2phidT2[-1] = ((dphidTFullList[-1] - dphidTFullList[-2]) / + (TFullList[-1] - TFullList[-2])) + # Now to construct the interpolation result = np.concatenate((fieldFullList, potentialEffFullList), axis=1) - self.newInterpolationTableFromValues(TFullList, result) + deriv1 = np.concatenate((dphidTFullList, dVdTFullList), axis=1) + deriv2 = np.concatenate((d2phidT2, d2VdT2FullList), axis=1) + self.newInterpolationTableFromValues(TFullList, result, [deriv1, deriv2], + interpolationDegree) def constructInterpolationFromArray( self, diff --git a/src/WallGo/interpolatableFunction.py b/src/WallGo/interpolatableFunction.py index 4643fab0..3675250f 100644 --- a/src/WallGo/interpolatableFunction.py +++ b/src/WallGo/interpolatableFunction.py @@ -7,8 +7,7 @@ from typing import Callable, Tuple import logging import numpy as np -from scipy.interpolate import CubicSpline - +from scipy.interpolate import make_interp_spline, BSpline from . import helpers inputType = list[float] | np.ndarray @@ -95,7 +94,7 @@ def __init__( assert returnValueCount >= 1 self._RETURN_VALUE_COUNT = returnValueCount # pylint: disable=invalid-name - self._interpolatedFunction: CubicSpline + self._interpolatedFunction: BSpline ## Will hold list of interpolated derivatives, 1st and 2nd derivatives only self._interpolatedDerivatives: list[Callable] @@ -242,6 +241,8 @@ def newInterpolationTableFromValues( self, x: inputType, fx: outputType, + derivatives: list[outputType] | None = None, + splineDegree: int = 3 ) -> None: """ Like initializeInterpolationTable but takes in precomputed function values 'fx' @@ -252,9 +253,11 @@ def newInterpolationTableFromValues( Points where the function was evaluated. fx : list[float | np.ndarray] or np.ndarray Value of the function at x. - + derivatives : list[outputType] | None + List containing the values of each derivative of the function at x. If None, + computes the derivatives from the interpolated spline. """ - self._interpolate(x, fx) + self._interpolate(x, fx, derivatives, splineDegree) def scheduleForInterpolation(self, x: inputType, fx: outputType) -> None: """ @@ -504,7 +507,9 @@ def derivative( """ x = np.asanyarray(x) - if not bUseInterpolation or not self.hasInterpolation() or order > 2: + if (not bUseInterpolation or + not self.hasInterpolation() or + order > len(self._interpolatedDerivatives)): return helpers.derivative(self._evaluateDirectly, x, n=order) # Use interpolated values whenever possible @@ -555,6 +560,8 @@ def _interpolate( self, x: inputType, fx: outputType, + derivatives: list[outputType] | None = None, + splineDegree: int = 3, ) -> None: """Does the actual interpolation and sets some internal values. Input x needs to be 1D, and input fx needs to be at most 2D. @@ -567,19 +574,21 @@ def _interpolate( ) ## Can't specify different extrapolation methods for x > xmax, x < xmin in - ## CubicSpline! This logic is handled manually in __call__() + ## Spline! This logic is handled manually in __call__() bShouldExtrapolate = EExtrapolationType.FUNCTION in ( self.extrapolationTypeLower, self.extrapolationTypeUpper, ) ## Explicitly drop non-numerics - xFiltered, fxFiltered = self._dropBadPoints(x, fx) + xFiltered, fxFiltered, derivativesFiltered = self._dropBadPoints(x, fx, + derivatives) ## This works even if f(x) is vector valued - self._interpolatedFunction = CubicSpline( - xFiltered, fxFiltered, extrapolate=bShouldExtrapolate, axis=0 + self._interpolatedFunction = make_interp_spline( + xFiltered, fxFiltered, k=splineDegree, axis=0 ) + self._interpolatedFunction.extrapolate = bShouldExtrapolate self._rangeMin = np.min(xFiltered) self._rangeMax = np.max(xFiltered) @@ -589,32 +598,54 @@ def _interpolate( """Store a cubic spline for the 1st and 2nd derivatives into a list. We do not attempt to spline the higher derivatives as they are not guaranteed to be continuous.""" - self._interpolatedDerivatives = [ - self._interpolatedFunction.derivative(1), - self._interpolatedFunction.derivative(2), - ] + if derivatives is None or len(derivatives) == 0: + self._interpolatedDerivatives = [ + self._interpolatedFunction.derivative(1), + self._interpolatedFunction.derivative(2), + ] + else: + self._interpolatedDerivatives = [] + for d in derivativesFiltered: + self._interpolatedDerivatives.append(make_interp_spline( + xFiltered, d, k=splineDegree, axis=0 + )) + self._interpolatedDerivatives[-1].extrapolate = bShouldExtrapolate + if len(self._interpolatedDerivatives) == 1: + self._interpolatedDerivatives.append( + self._interpolatedDerivatives[0].derivative(1)) @staticmethod def _dropBadPoints( x: np.ndarray, fx: np.ndarray, - ) -> tuple[np.ndarray, np.ndarray]: + derivatives: list[outputType] | None = None, + ) -> tuple[np.ndarray, np.ndarray, list[outputType] | None]: """ Removes non-numerical (x, fx) pairs. For 2D fx the check is applied row-wise. Input x needs to be 1D, and input fx needs to be at most 2D. Output is same shape as input. """ + if derivatives is None: + derivativesValid = None + else: + derivativesValid = [] if fx.ndim > 1: validIndices = np.all(np.isfinite(fx), axis=1) fxValid = fx[validIndices] + if derivatives is not None: + for d in derivatives: + derivativesValid.append(d[validIndices]) else: ## fx is 1D array validIndices = np.all(np.isfinite(fx)) fxValid = np.ravel(fx[validIndices]) + if derivatives is not None: + for d in derivatives: + derivativesValid.append(np.ravel(d[validIndices])) xValid = np.ravel(x[validIndices]) - return xValid, fxValid + return xValid, fxValid, derivativesValid def _adaptiveInterpolationUpdate(self) -> None: """ diff --git a/src/WallGo/manager.py b/src/WallGo/manager.py index 18d5cd2d..a2d735a4 100644 --- a/src/WallGo/manager.py +++ b/src/WallGo/manager.py @@ -238,13 +238,13 @@ def validatePhaseInput(self, phaseInput: PhaseInfo) -> None: phaseLocation1, effPotValue1, ) = self.model.getEffectivePotential().findLocalMinimum( - phaseInput.phaseLocation1, T + phaseInput.phaseLocation1, T, method='Nelder-Mead' ) ( phaseLocation2, effPotValue2, ) = self.model.getEffectivePotential().findLocalMinimum( - phaseInput.phaseLocation2, T + phaseInput.phaseLocation2, T, method='Nelder-Mead' ) logging.info(f"Found phase 1: phi = {phaseLocation1}, Veff(phi) = {effPotValue1}") @@ -410,6 +410,15 @@ def initTemperatureRange( if TLowTMinTemplate is None: TLowTMinTemplate = self.config.configHydrodynamics.tmin * Tn + phaseTracerTol = self.config.configThermodynamics.phaseTracerTol + interpolationDegree = self.config.configThermodynamics.interpolationDegree + + # Estimate of the dT needed to reach the desired tolerance considering + # the error of a cubic spline scales like dT**4. + dT = ( + self.model.getEffectivePotential().derivativeSettings.temperatureVariationScale + * phaseTracerTol**0.25 + ) """Since the template model is an approximation of the full model, and since the temperature profile in the wall could be non-monotonous, we should not take exactly the TMin and TMax from the template model. diff --git a/tests/Benchmarks/SingletSM_Z2/conftest.py b/tests/Benchmarks/SingletSM_Z2/conftest.py index 7f2bb11b..42efa531 100644 --- a/tests/Benchmarks/SingletSM_Z2/conftest.py +++ b/tests/Benchmarks/SingletSM_Z2/conftest.py @@ -123,8 +123,11 @@ def singletBenchmarkThermo_interpolate( """ Then manually interpolate """ TMin, TMax, dT = BM.config["interpolateTemperatureRange"] - thermo.freeEnergyHigh.tracePhase(TMin, TMax, dT) - thermo.freeEnergyLow.tracePhase(TMin, TMax, dT) + # To meet the high accuracy requirement of this test, we set the interpolation order + # to 3. We do not recommend to do this in general, as it can lead to unphysical + #features in the speed of sound. + thermo.freeEnergyHigh.tracePhase(TMin, TMax, dT, interpolationDegree=3) + thermo.freeEnergyLow.tracePhase(TMin, TMax, dT, interpolationDegree=3) thermo.setExtrapolate() @@ -170,8 +173,11 @@ def singletSimpleBenchmarkFreeEnergy( dT = 0.1 BM.config["interpolateTemperatureRange"] = TMin, TMax, dT - freeEnergy1.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False) - freeEnergy2.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False) + # To meet the high accuracy requirement of this test, we set the interpolation order + # to 3. We do not recommend to do this in general, as it can lead to unphysical + #features in the speed of sound. + freeEnergy1.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False, interpolationDegree=3) + freeEnergy2.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False, interpolationDegree=3) yield freeEnergy1, freeEnergy2, BM @@ -207,8 +213,11 @@ def singletSimpleBenchmarkThermodynamics( thermo.freeEnergyHigh.disableAdaptiveInterpolation() thermo.freeEnergyLow.disableAdaptiveInterpolation() - thermo.freeEnergyHigh.tracePhase(TMin, TMax, dT) - thermo.freeEnergyLow.tracePhase(TMin, TMax, dT) + # To meet the high accuracy requirement of this test, we set the interpolation order + # to 3. We do not recommend to do this in general, as it can lead to unphysical + #features in the speed of sound. + thermo.freeEnergyHigh.tracePhase(TMin, TMax, dT, interpolationDegree=3) + thermo.freeEnergyLow.tracePhase(TMin, TMax, dT, interpolationDegree=3) thermo.setExtrapolate() From 11962a2aaffecbd06c08aed8523f47b0300bd893 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:37:37 +0200 Subject: [PATCH 07/24] Merge pull request #25 from Wall-Go/EMconservation EM conservation/violation --- src/WallGo/equationOfMotion.py | 344 ++++++++++++++++++++++++++++----- src/WallGo/results.py | 18 ++ tests/test_EOM.py | 1 + 3 files changed, 317 insertions(+), 46 deletions(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 9f3a7cbc..df079c5e 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -53,6 +53,7 @@ def __init__( errTol: float = 1e-3, maxIterations: int = 10, pressRelErrTol: float = 0.3679, + # pylint: disable=too-many-arguments, too-many-positional-arguments ): """ Initialization @@ -139,6 +140,7 @@ def __init__( # also getting the LTE results self.wallVelocityLTE = self.hydrodynamics.findvwLTE() + def findWallVelocityDeflagrationHybrid( self, wallThicknessIni: float | None = None ) -> WallGoResults: @@ -179,7 +181,7 @@ def findWallVelocityDeflagrationHybrid( vmax = min(self.hydrodynamics.vJ, self.hydrodynamics.fastestDeflag()) if vmax < self.hydrodynamics.vJ and ( - self.hydrodynamics.doesPhaseTraceLimitvmax[0] + self.hydrodynamics.doesPhaseTraceLimitvmax[0] or self.hydrodynamics.doesPhaseTraceLimitvmax[1] ): logging.warning( @@ -452,6 +454,8 @@ def solveWall( boltzmannResultsMax, boltzmannBackgroundMax, hydroResultsMax, + EMviolationT30Max, + EMviolationT33Max, ) = self.wallPressure(wallVelocityMax, wallParamsGuess) else: ( @@ -460,6 +464,8 @@ def solveWall( boltzmannResultsMax, boltzmannBackgroundMax, hydroResultsMax, + EMviolationT30Max, + EMviolationT33Max, ) = wallPressureResultsMax # The pressure peak is not enough to stop the wall: no deflagration or @@ -472,6 +478,7 @@ def solveWall( results.setHydroResults(hydroResultsMax) results.setBoltzmannBackground(boltzmannBackgroundMax) results.setBoltzmannResults(boltzmannResultsMax) + results.setViolationOfEMConservation((EMviolationT30Max, EMviolationT33Max)) results.setSuccessState( True, ESolutionType.RUNAWAY, @@ -488,6 +495,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, + EMviolationT30Min, + EMviolationT33Min, ) = self.wallPressure(wallVelocityMin, wallParamsGuess) else: ( @@ -496,6 +505,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, + EMviolationT30Min, + EMviolationT33Min, ) = wallPressureResultsMin while pressureMin > 0: @@ -513,6 +524,9 @@ def solveWall( results.setHydroResults(hydroResultsMin) results.setBoltzmannBackground(boltzmannBackgroundMin) results.setBoltzmannResults(boltzmannResultsMin) + results.setViolationOfEMConservation( + EMviolationT30Min, EMviolationT33Min + ) results.setSuccessState( False, ESolutionType.ERROR, @@ -526,6 +540,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, + EMviolationT30Min, + EMviolationT33Min, ) = self.wallPressure(wallVelocityMin, wallParamsGuess) self.pressAbsErrTol = ( @@ -584,21 +600,21 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name boltzmannResults, boltzmannBackground, hydroResults, + EMviolationT30, + EMviolationT33, ) = self.wallPressure( wallVelocity, newWallParams, boltzmannResultsInput=newBoltzmannResults ) - + eomResidual = self.estimateTanhError( - wallParams, - boltzmannResults, - boltzmannBackground, - hydroResults + wallParams, boltzmannResults, boltzmannBackground, hydroResults ) - + # Computing the linearisation criteria if self.includeOffEq: criterion1, criterion2 = self.boltzmannSolver.checkLinearization( - boltzmannResults.deltaF) + boltzmannResults.deltaF + ) boltzmannResults.linearizationCriterion1 = criterion1 boltzmannResults.linearizationCriterion2 = criterion2 @@ -648,6 +664,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name results.setBoltzmannBackground(boltzmannBackground) results.setBoltzmannResults(boltzmannResults) results.setFiniteDifferenceBoltzmannResults(finiteDifferenceBoltzmannResults) + results.setViolationOfEMConservation((EMviolationT30, EMviolationT33)) results.eomResidual = eomResidual # Set the message @@ -718,7 +735,15 @@ def wallPressure( atol: float | None = None, rtol: float | None = None, boltzmannResultsInput: BoltzmannResults | None = None, - ) -> tuple[float, WallParams, BoltzmannResults, BoltzmannBackground, HydroResults]: + ) -> tuple[ + float, + WallParams, + BoltzmannResults, + BoltzmannBackground, + HydroResults, + float, + float, + ]: """ Computes the total pressure on the wall by finding the tanh profile that minimizes the action. Can use two different iteration algorithms @@ -844,6 +869,8 @@ def wallPressure( wallParams, boltzmannResults, boltzmannBackground, + EMviolationBefore, + EMviolationAfter, ) = self._intermediatePressureResults( wallParams, vevLowT, @@ -878,9 +905,14 @@ def wallPressure( multiplier = 1.0 i = 0 - logging.debug( - f"{'pressure':>12s} {'error':>12s} {'errorSolver':>12s} {'errTol':>12s} {'cautious':>12s} {'multiplier':>12s}" - ) + if self.includeOffEq: + logging.debug( + f"{'pressure':>12s} {'error':>12s} {'errorSolver':>12s} {'errTol':>12s} {'cautious':>12s} {'multiplier':>12s} {'EMViolation before (T30)':>20s} {'EMViolation after (T30)':>20s}" + ) + else: + logging.debug( + f"{'pressure':>12s} {'error':>12s} {'errorSolver':>12s} {'errTol':>12s} {'cautious':>12s} {'multiplier':>12s} {'EMViolation (T30)':>20s}" + ) while True: if improveConvergence: # Use the improved algorithm (which converges better but slowly) @@ -890,6 +922,8 @@ def wallPressure( boltzmannResults, boltzmannBackground, errorSolver, + EMviolationBefore, + EMviolationAfter, ) = self._getNextPressure( pressure, wallParams, @@ -911,6 +945,8 @@ def wallPressure( wallParams, boltzmannResults, boltzmannBackground, + EMviolationBefore, + EMviolationAfter, ) = self._intermediatePressureResults( wallParams, vevLowT, @@ -931,9 +967,14 @@ def wallPressure( error = np.abs(pressures[-1] - pressures[-2]) errTol = np.maximum(rtol * np.abs(pressure), atol) * multiplier - logging.debug( - f"{pressure:>12g} {error:>12g} {errorSolver:>12g} {errTol:>12g} {improveConvergence:>12} {multiplier:>12g}" - ) + if self.includeOffEq: + logging.debug( + f"{pressure:>12g} {error:>12g} {errorSolver:>12g} {errTol:>12g} {improveConvergence:>12} {multiplier:>12g} {EMviolationBefore[0]:>20g} {EMviolationAfter[0]:>20g}" + ) + else: + logging.debug( + f"{pressure:>12g} {error:>12g} {errorSolver:>12g} {errTol:>12g} {improveConvergence:>12} {multiplier:>12g} {EMviolationBefore[0]:>20g}" + ) i += 1 if error < errTol or (errorSolver < errTol and improveConvergence): @@ -977,13 +1018,15 @@ def wallPressure( logging.info(f"Final {pressure=:g}") logging.debug(f"Final {wallParams=}") - + return ( pressure, wallParams, boltzmannResults, boltzmannBackground, hydroResults, + EMviolationAfter[0], + EMviolationAfter[1], ) def _getNextPressure( @@ -1015,6 +1058,8 @@ def _getNextPressure( wallParams2, boltzmannResults2, _, + _, + _, ) = self._intermediatePressureResults( wallParams1, vevLowT, @@ -1034,6 +1079,8 @@ def _getNextPressure( wallParams3, boltzmannResults3, boltzmannBackground3, + EMviolationBefore, + EMviolationAfter, ) = self._intermediatePressureResults( wallParams2, vevLowT, @@ -1053,7 +1100,15 @@ def _getNextPressure( ## last update go in the same direction), returns the last iteration. if (pressure3 - pressure2) * (pressure2 - pressure1) >= 0: err = abs(pressure3 - pressure2) - return pressure3, wallParams3, boltzmannResults3, boltzmannBackground3, err + return ( + pressure3, + wallParams3, + boltzmannResults3, + boltzmannBackground3, + err, + EMviolationBefore, + EMviolationAfter, + ) ## If the last iteration overshot, uses linear interpolation to find a ## better estimate of the true solution. @@ -1063,6 +1118,8 @@ def _getNextPressure( wallParams4, boltzmannResults4, boltzmannBackground4, + EMviolationBefore, + EMviolationAfter, ) = self._intermediatePressureResults( wallParams1 + (wallParams2 - wallParams1) * interpPoint, vevLowT, @@ -1078,7 +1135,15 @@ def _getNextPressure( multiplier, ) err = abs(pressure4 - pressure2) - return pressure4, wallParams4, boltzmannResults4, boltzmannBackground4, err + return ( + pressure4, + wallParams4, + boltzmannResults4, + boltzmannBackground4, + err, + EMviolationBefore, + EMviolationAfter, + ) def _intermediatePressureResults( self, @@ -1094,7 +1159,14 @@ def _intermediatePressureResults( temperatureProfileInput: np.ndarray | None = None, velocityProfileInput: np.ndarray | None = None, multiplier: float = 1.0, - ) -> tuple[float, WallParams, BoltzmannResults, BoltzmannBackground]: + ) -> tuple[ + float, + WallParams, + BoltzmannResults, + BoltzmannBackground, + tuple[float, float], + tuple[float, float], + ]: """ Performs one step of the iteration procedure to update the pressure, wall parameters and Boltzmann solution. This is done by first solving @@ -1134,6 +1206,19 @@ def _intermediatePressureResults( temperatureProfile = temperatureProfileInput velocityProfile = velocityProfileInput + ## Compute the violation of energy-momentum conservation before solving the Boltzmann equation + violationOfEMConservationBefore = self.violationOfEMConservation( + c1, + c2, + velocityMid, + fields, + dfieldsdz, + boltzmannResults.Deltas, + temperatureProfile, + velocityProfile, + max(wallParams.widths), + ) + ## Prepare a new background for Boltzmann TWithEndpoints: np.ndarray = np.concatenate( (np.array([Tminus]), np.array(temperatureProfile), np.array([Tplus])) @@ -1208,6 +1293,19 @@ def actionWrapper( ) dVdPhi = self.thermo.effectivePotential.derivField(fields, temperatureProfile) + ## Compute the violation of energy-momentum conservation after solving the Boltzmann equation + violationOfEMConservationAfter = self.violationOfEMConservation( + c1, + c2, + velocityMid, + fields, + dPhidz, + boltzmannResults.Deltas, + temperatureProfile, + velocityProfile, + max(wallParams.widths), + ) + # Out-of-equilibrium term of the EOM dVout = ( np.sum( @@ -1233,7 +1331,14 @@ def actionWrapper( dzdchi, _, _ = self.grid.getCompactificationDerivatives() pressure = eomPoly.integrate(weight=-dzdchi) - return pressure, wallParams, boltzmannResults, boltzmannBackground + return ( + pressure, + wallParams, + boltzmannResults, + boltzmannBackground, + violationOfEMConservationBefore, + violationOfEMConservationAfter, + ) def _toWallParams(self, wallArray: np.ndarray) -> WallParams: offsets: np.ndarray = np.concatenate( @@ -1364,14 +1469,14 @@ def action( ) return float(U + K) - + def estimateTanhError( - self, - wallParams: WallParams, - boltzmannResults: BoltzmannResults, - boltzmannBackground: BoltzmannBackground, - hydroResults: HydroResults, - ) -> np.ndarray: + self, + wallParams: WallParams, + boltzmannResults: BoltzmannResults, + boltzmannBackground: BoltzmannBackground, + hydroResults: HydroResults, + ) -> np.ndarray: """ Estimates the EOM error due to the tanh ansatz. It is estimated by the integral @@ -1382,13 +1487,13 @@ def estimateTanhError( .. math:: \Delta[\mathrm{EOM}^2]=\int\! dz\, (-\partial_z^2 \phi+ \partial V_{\mathrm{eq}}/ \partial \phi+ \partial V_{\mathrm{out}}/ \partial \phi )^2 and - + .. math:: |\mathrm{EOM}^2|=\int\! dz\, [(\partial_z^2 \phi)^2+ (\partial V_{\mathrm{eq}}/ \partial \phi)^2+ (\partial V_{\mathrm{out}}/ \partial \phi)^2]. - + """ Tminus = hydroResults.temperatureMinus Tplus = hydroResults.temperaturePlus - + # Positions of the phases TminusEval = max( min(Tminus, self.thermo.freeEnergyLow.interpolationRangeMax()), @@ -1400,18 +1505,18 @@ def estimateTanhError( ) vevLowT = self.thermo.freeEnergyLow(TminusEval).fieldsAtMinimum vevHighT = self.thermo.freeEnergyHigh(TplusEval).fieldsAtMinimum - + temperatureProfile = boltzmannBackground.temperatureProfile[1:-1] - + z = self.grid.xiValues fields = self.wallProfile(z, vevLowT, vevHighT, wallParams)[0] d2FieldsDz2 = -( - (vevHighT-vevLowT) - * np.tanh(z[:,None]/wallParams.widths[None,:] + wallParams.offsets) - / np.cosh(z[:,None]/wallParams.widths[None,:] + wallParams.offsets)**2 + (vevHighT - vevLowT) + * np.tanh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) + / np.cosh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) ** 2 / wallParams.widths**2 - ) - + ) + dVdPhi = self.thermo.effectivePotential.derivField(fields, temperatureProfile) # Out-of-equilibrium term of the EOM @@ -1427,17 +1532,17 @@ def estimateTanhError( ) / 2 ) - - eomSq = (-d2FieldsDz2 + dVdPhi + dVout)**2 + + eomSq = (-d2FieldsDz2 + dVdPhi + dVout) ** 2 eomSqScale = d2FieldsDz2**2 + dVdPhi**2 + dVout**2 - + eomSqPoly = Polynomial(eomSq, self.grid, basis=("Cardinal", "Array")) eomSqScalePoly = Polynomial(eomSqScale, self.grid, basis=("Cardinal", "Array")) dzdchi, _, _ = self.grid.getCompactificationDerivatives() - eomSqResidual = eomSqPoly.integrate(axis=0, weight=dzdchi[:,None]) - eomSqScaleIntegrated = eomSqScalePoly.integrate(axis=0, weight=dzdchi[:,None]) - - return eomSqResidual.coefficients/eomSqScaleIntegrated.coefficients + eomSqResidual = eomSqPoly.integrate(axis=0, weight=dzdchi[:, None]) + eomSqScaleIntegrated = eomSqScalePoly.integrate(axis=0, weight=dzdchi[:, None]) + + return eomSqResidual.coefficients / eomSqScaleIntegrated.coefficients def wallProfile( self, @@ -1680,7 +1785,7 @@ def plasmaVelocity( Plasma velocity. """ - # Need enthalpy ouside a free-energy minimum (eq .(12) in arXiv:2204.13120v1) + # Need enthalpy outside a free-energy minimum (eq .(12) in arXiv:2204.13120v1) enthalpy = -T * self.thermo.effectivePotential.derivT(fields, T) return float((-enthalpy + np.sqrt(4 * s1**2 + enthalpy**2)) / (2 * s1)) @@ -1715,7 +1820,7 @@ def temperatureProfileEqLHS( LHS of Eq. (20) of arXiv:2204.13120v1. """ - # Need enthalpy ouside a free-energy minimum (eq (12) in the ref.) + # Need enthalpy outside a free-energy minimum (eq (12) in the ref.) enthalpy = -T * self.thermo.effectivePotential.derivT(fields, T) kineticTerm = 0.5 * np.sum(dPhidz**2).view(np.ndarray) @@ -1861,3 +1966,150 @@ def getBoltzmannFiniteDifference(self) -> BoltzmannResults: boltzmannSolverFiniteDifference.collisionArray.changeBasis("Cardinal") # now computing results return boltzmannSolverFiniteDifference.getDeltas() + + def violationOfEMConservation( + self, + c1: float, # pylint: disable=invalid-name + c2: float, # pylint: disable=invalid-name + velocityMid: float, + fields: Fields, + dPhidz: Fields, + offEquilDeltas: BoltzmannDeltas, + temperatureProfile: np.ndarray, + velocityProfile: np.ndarray, + wallThickness: float, + ) -> Tuple[float, float]: + r""" + Determines the RMS (along the grid) of the residual of the energy-momentum equations (18) of arXiv:2204.13120v1. + + Parameters + ---------- + index : int + Index of the grid point. + c1 : float + Value of the :math:`T^{30}` component of the energy-momentum tensor. + c2 : float + Value of the :math:`T^{33}` component of the energy-momentum tensor. + velocityMid : float + Midpoint of plasma velocity in the wall frame, :math:`(v_+ + v_-)/2`. + fields : FieldPoint + Scalar field profile. + dPhidz : FieldPoint + Derivative with respect to the position of the scalar field profile. + offEquilDeltas : BoltzmannDeltas + BoltzmannDeltas object containing the off-equilibrium Delta functions + temperatureProfile: np.ndarray + Plasma temperature profile at the grid points. + velocityProfile: np.ndarray + Plasma velocity profile at the grid points. + wallThickness: float + Thickness of the wall, used to normalize the violations. + + Returns + ------- + violationEM30, violationEM33 : (float, float) + Violation of energy-momentum conservation in T03 and T33 integrated over the grid, + normalized by the wall thickness. + + """ + + violationT30sq = np.zeros(len(self.grid.xiValues)) + violationT33sq = np.zeros(len(self.grid.xiValues)) + + for index in range(len(self.grid.xiValues)): + vt30, vt33 = self.violationEMPoint( + index, + c1, + c2, + velocityMid, + fields.getFieldPoint(index), + dPhidz.getFieldPoint(index), + offEquilDeltas, + temperatureProfile[index], + velocityProfile[index], + ) + + violationT30sq[index] = ( + (np.asarray(vt30).item()) ** 2 + if isinstance(vt30, np.ndarray) + else vt30**2 + ) + violationT33sq[index] = ( + (np.asarray(vt33).item()) ** 2 + if isinstance(vt33, np.ndarray) + else vt33**2 + ) + + T30Poly = Polynomial(violationT30sq, self.grid) + T33Poly = Polynomial(violationT33sq, self.grid) + dzdchi, _, _ = self.grid.getCompactificationDerivatives() + violationT30sqIntegrated = T30Poly.integrate(weight=dzdchi) + violationT33sqIntegrated = T33Poly.integrate(weight=dzdchi) + + return ( + np.sqrt(violationT30sqIntegrated) / wallThickness, + np.sqrt(violationT33sqIntegrated) / wallThickness, + ) + + def violationEMPoint( + self, + index: int, + c1: float, # pylint: disable=invalid-name + c2: float, # pylint: disable=invalid-name + velocityMid: float, + fields: FieldPoint, + dPhidz: FieldPoint, + offEquilDeltas: BoltzmannDeltas, + T: float, + v: float, # pylint: disable=invalid-name + ) -> Tuple[float, float]: + r""" + Determines the residual of the energy-momentum equations (18) of arXiv:2204.13120v1 locally. + + Parameters + ---------- + index : int + Index of the grid point. + c1 : float + Value of the :math:`T^{30}` component of the energy-momentum tensor. + c2 : float + Value of the :math:`T^{33}` component of the energy-momentum tensor. + velocityMid : float + Midpoint of plasma velocity in the wall frame, :math:`(v_+ + v_-)/2`. + fields : FieldPoint + Scalar field profile. + dPhidz : FieldPoint + Derivative with respect to the position of the scalar field profile. + offEquilDeltas : BoltzmannDeltas + BoltzmannDeltas object containing the off-equilibrium Delta functions + T: float + Plasma temperature at the point grid.xiValues[index]. + v: float + Plasma velocity at the point grid.xiValues[index]. + + Returns + ------- + violationEM30, violationEM33 : float + Violation of energy-momentum conservation in T03 and T33 at the point grid.xiValues[index]. + + """ + + # Computing the out-of-equilibrium part of the energy-momentum tensor + Tout30, Tout33 = self.deltaToTmunu(index, fields, velocityMid, offEquilDeltas) + + # Need enthalpy ouside a free-energy minimum (eq .(12) in arXiv:2204.13120v1) + enthalpy = -T * self.thermo.effectivePotential.derivT(fields, T) + + # Kinetic term + kineticTerm = 0.5 * np.sum(dPhidz**2).view(np.ndarray) + + ## eff potential at this field point and temperature. NEEDS the T-dep constant + veff = self.thermo.effectivePotential.evaluate(fields, T) + + violationEM30 = (enthalpy * v / (1 - v**2) + Tout30 - c1) / c1 + + violationEM33 = ( + kineticTerm - veff + enthalpy * v**2 / (1 - v**2) + Tout33 - c2 + ) / c2 + + return (violationEM30, violationEM33) diff --git a/src/WallGo/results.py b/src/WallGo/results.py index b9f4141c..8b5935f8 100644 --- a/src/WallGo/results.py +++ b/src/WallGo/results.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from enum import Enum import numpy as np +from typing import Tuple from .fields import Fields from .containers import BoltzmannBackground, BoltzmannDeltas, WallParams @@ -217,6 +218,12 @@ class WallGoResults: :math:`\mathcal{E}_\text{pl}^{n_\mathcal{E}}\mathcal{P}_\text{pl}^{n_\mathcal{P}}\delta f`, using finite differences instead of spectral expansion.""" + violationOfEMConservation: Tuple[float,float] + """ + RMS along the grid of the violation of the conservation of the components T30 and T33 of + the energy-momentum tensor. + """ + solutionType: ESolutionType """ Describes the type of solution obtained. Must be a ESolutionType object. The @@ -294,6 +301,17 @@ def setFiniteDifferenceBoltzmannResults( self.deltaFFiniteDifference = boltzmannResults.deltaF self.DeltasFiniteDifference = boltzmannResults.Deltas + def setViolationOfEMConservation( + self, violationOfEMConservation: Tuple[float, float] + ) -> None: + """ + Set the violation of energy-momentum conservation results + """ + assert ( + len(violationOfEMConservation) == 2 + ), "WallGoResults Error: violationOfEMConservation must be a tuple of two floats." + self.violationOfEMConservation = violationOfEMConservation + def setSuccessState( self, success: bool, diff --git a/tests/test_EOM.py b/tests/test_EOM.py index 2a8459da..a5c5d866 100644 --- a/tests/test_EOM.py +++ b/tests/test_EOM.py @@ -313,6 +313,7 @@ def test_EOMSolver(muSq, lam): boltzmannResults, boltzmannBackground, hydroResults, + *_ ) = eom.wallPressure(0.3, wallParams) tanhError = eom.estimateTanhError(wallParams, boltzmannResults, boltzmannBackground, hydroResults)[0] From d65117d6fb1ddb7d23080c45b4ece1ebc984cd1d Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:40:55 +0200 Subject: [PATCH 08/24] Merge pull request #29 from Wall-Go/moreLightHiggsPhaseTraceNew Light Higgs phase trace test --- Models/StandardModel/standardModel.py | 11 +- tests/BenchmarkPoint.py | 41 +++- .../Benchmarks/StandardModel/Benchmarks_SM.py | 222 ++++++++++++++++++ tests/Benchmarks/StandardModel/__init__.py | 0 tests/Benchmarks/StandardModel/conftest.py | 148 ++++++++++++ tests/Benchmarks/StandardModel/test_Tc.py | 24 ++ .../StandardModel/test_phaseTrace.py | 23 ++ 7 files changed, 455 insertions(+), 14 deletions(-) create mode 100644 tests/Benchmarks/StandardModel/Benchmarks_SM.py create mode 100644 tests/Benchmarks/StandardModel/__init__.py create mode 100644 tests/Benchmarks/StandardModel/conftest.py create mode 100644 tests/Benchmarks/StandardModel/test_Tc.py create mode 100644 tests/Benchmarks/StandardModel/test_phaseTrace.py diff --git a/Models/StandardModel/standardModel.py b/Models/StandardModel/standardModel.py index f9afe3c3..83eb0b71 100644 --- a/Models/StandardModel/standardModel.py +++ b/Models/StandardModel/standardModel.py @@ -25,7 +25,6 @@ A Study of the electroweak phase transition dynamics, Phys.Rev.D 52 (1995) 7182-7204 doi:10.1103/PhysRevD.52.7182 """ - import sys import pathlib import numpy as np @@ -299,9 +298,9 @@ def evaluate( # pylint: disable=R0914 lambdaT = self.modelParameters["lambda"] - 3 / ( 16 * np.pi * np.pi * self.modelParameters["v0"] ** 4 ) * ( - 2 * mW**4 * np.log(mW**2 / (ab * T**2) + 1e-100) - + mZ**4 * np.log(mZ**2 / (ab * T**2) + 1e-100) - - 4 * mt**4 * np.log(mt**2 / (af * T**2) + 1e-100) + 2 * mW**4 * np.log(mW**2 / (ab * T**2) ) + + mZ**4 * np.log(mZ**2 / (ab * T**2) ) + - 4 * mt**4 * np.log(mt**2 / (af * T**2) ) ) cT: float | np.ndarray = self.modelParameters["C0"] + 1 / ( @@ -317,7 +316,7 @@ def evaluate( # pylint: disable=R0914 potentialT: float | np.ndarray = ( self.modelParameters["D"] * (T**2 - self.modelParameters["T0sq"]) * v**2 - - cT * T**2 * pow(v, 2) * np.log(np.abs(v / T)) + - cT * T**2 * pow(v, 2) * np.log(np.abs(v / T) + 1e-100) # Avoid log(0) - eT * T * pow(v, 3) + lambdaT / 4 * pow(v, 4) ) @@ -529,7 +528,7 @@ def getBenchmarkPoints(self) -> list[ExampleInputPoint]: of the Higgs mass. """ valuesMH = [0.0, 34.0, 50.0, 70.0, 81.0] - valuesTn = [57.192, 70.579, 83.426, 102.344, 113.575] + valuesTn = [57.1958, 70.5793, 83.4251, 102.344, 113.575] output: list[ExampleInputPoint] = [] diff --git a/tests/BenchmarkPoint.py b/tests/BenchmarkPoint.py index 687c5a6f..ef036b16 100644 --- a/tests/BenchmarkPoint.py +++ b/tests/BenchmarkPoint.py @@ -1,6 +1,8 @@ import WallGo.genericModel +from typing import Any + ## Collect input params + other benchmark-specific data for various things in one place. class BenchmarkPoint: @@ -10,7 +12,10 @@ class BenchmarkPoint: phaseInfo: dict[str, float] ## This is WallGo internal config info that we may want to fix on a per-benchmark basis. IE. temperature interpolation ranges - config: dict[str, float] + # BREAKING CHANGE: The type annotation for `config` was changed from `dict[str, float]` to `dict[str, Any]` + # to allow for more flexible configuration values (e.g., nested dictionaries for derivative settings). + # This broadens the accepted types and may break code that expects all config values to be floats. + config: dict[str, Any] ## Expected results for the benchmark point expectedResults: dict[str, float] @@ -18,14 +23,14 @@ class BenchmarkPoint: def __init__( self, inputParams: dict[str, float], - phaseInfo: dict[str, float] = {}, - config: dict[str, float] = {}, - expectedResults: dict[str, float] = {}, + phaseInfo: dict[str, float] | None = None, + config: dict[str, Any] | None = None, + expectedResults: dict[str, float] | None = None, ): self.inputParams = inputParams - self.phaseInfo = phaseInfo - self.config = config - self.expectedResults = expectedResults + self.phaseInfo = phaseInfo or {} + self.config = config or {} + self.expectedResults = expectedResults or {} class BenchmarkModel: @@ -36,6 +41,26 @@ class BenchmarkModel: def __init__(self, model: WallGo.GenericModel, benchmarkPoint: BenchmarkPoint): self.model = model - self.model.getEffectivePotential().configureDerivatives(WallGo.VeffDerivativeSettings(1.0, 1.0)) + + # Apply derivative settings if specified in benchmark configuration + derivative_settings = benchmarkPoint.config.get("derivativeSettings") + if derivative_settings is not None: + if isinstance(derivative_settings, dict): + temp_scale = derivative_settings.get("temperatureVariationScale", 1.0) + field_scale = derivative_settings.get("fieldValueVariationScale", 1.0) + self.model.getEffectivePotential().configureDerivatives( + WallGo.VeffDerivativeSettings(temp_scale, field_scale) + ) + else: + # Use default settings if configuration is malformed + self.model.getEffectivePotential().configureDerivatives( + WallGo.VeffDerivativeSettings(1.0, 1.0) + ) + else: + # Use default settings if not specified + self.model.getEffectivePotential().configureDerivatives( + WallGo.VeffDerivativeSettings(1.0, 1.0) + ) + self.model.getEffectivePotential().effectivePotentialError = 1e-15 self.benchmarkPoint = benchmarkPoint diff --git a/tests/Benchmarks/StandardModel/Benchmarks_SM.py b/tests/Benchmarks/StandardModel/Benchmarks_SM.py new file mode 100644 index 00000000..3ea49d00 --- /dev/null +++ b/tests/Benchmarks/StandardModel/Benchmarks_SM.py @@ -0,0 +1,222 @@ +import WallGo.fields + +from tests.BenchmarkPoint import BenchmarkPoint + +BM1 = BenchmarkPoint( + inputParams={ + "v0": 246.0, + "mW": 80.4, + "mZ": 91.2, + "mt": 174.0, + "g3": 1.2279920495357861, + "mH": 0.0, + }, + phaseInfo={ + "Tn":57.1958, + ## Guesses for phase locations + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([55.]), + }, + config={ + ## Give TMin, TMax, dT as a tuple + "interpolateTemperatureRangeHighTPhase": ( + 46, + 58., + 0.01, + ), ##Set by hand such that the lowest temperature is (slightly) below the actual minimum temperature + "interpolateTemperatureRangeLowTPhase": ( + 56., + 58., + 0.01, + ), ##Set by hand such that the highest temperature is (slightly) above the actual maximum temperature + "derivativeSettings": { + "temperatureVariationScale": 0.75, + "fieldValueVariationScale": 50.0, + }, ## Optimized settings for Standard Model + }, + ## Will probs need to adjust these once we decide on what our final implementation of the benchmark model is + expectedResults={ + "Tc": 57.4104, + ## Phase locations at nucleation temperature + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([55.806]), + "minimumTemperaturePhase1": 51.8199, + "maximumTemperaturePhase2": 57.583, + }, +) + +BM2 = BenchmarkPoint( + inputParams={ + "v0": 246.0, + "mW": 80.4, + "mZ": 91.2, + "mt": 174.0, + "g3": 1.2279920495357861, + "mH": 34.0, + }, + phaseInfo={ + "Tn": 70.5793, + ## Guesses for phase locations + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([64.6294]), + }, + config={ + ## Give TMin, TMax, dT as a tuple + "interpolateTemperatureRangeHighTPhase": ( + 60., + 75., + 0.01, + ), ##Set by hand such that the lowest temperature is (slightly) below the actual minimum temperature + "interpolateTemperatureRangeLowTPhase": ( + 66., + 72.5, + 0.01, + ), ##Set by hand such that the highest temperature is (slightly) above the actual maximum temperature + "derivativeSettings": { + "temperatureVariationScale": 0.75, + "fieldValueVariationScale": 50.0, + }, ## Optimized settings for Standard Model + }, + ## Will probs need to adjust these once we decide on what our final implementation of the benchmark model is + expectedResults={ + "Tc": 70.8238, + ## Phase locations at nucleation temperature + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([64.9522]), + "minimumTemperaturePhase1": 63.8464, + "maximumTemperaturePhase2": 71.025, + }, +) + +BM3 = BenchmarkPoint( + inputParams={ + "v0": 246.0, + "mW": 80.4, + "mZ": 91.2, + "mt": 174.0, + "g3": 1.2279920495357861, + "mH": 50.0, + }, + phaseInfo={ + "Tn": 83.4251, + ## Guesses for phase locations + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([67.2538]), + }, + config={ + ## Give TMin, TMax, dT as a tuple + "interpolateTemperatureRangeHighTPhase": ( + 70., + 90., + 0.01, + ), ##Set by hand such that the lowest temperature is (slightly) below the actual minimum temperature + "interpolateTemperatureRangeLowTPhase": ( + 75., + 85., + 0.01, + ), ##Set by hand such that the highest temperature is (slightly) above the actual maximum temperature + "derivativeSettings": { + "temperatureVariationScale": 0.75, + "fieldValueVariationScale": 50.0, + }, ## Optimized settings for Standard Model + }, + ## Will probs need to adjust these once we decide on what our final implementation of the benchmark model is + expectedResults={ + "Tc": 83.668, + ## Phase locations at nucleation temperature + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([67.2538]), + "minimumTemperaturePhase1": 75.291, + "maximumTemperaturePhase2": 83.879, + }, +) + +BM4 = BenchmarkPoint( + inputParams={ + "v0": 246.0, + "mW": 80.4, + "mZ": 91.2, + "mt": 174.0, + "g3": 1.2279920495357861, + "mH": 70.0, + }, + phaseInfo={ + "Tn": 102.344, + ## Guesses for phase locations + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([65.8969]), + }, + config={ + ## Give TMin, TMax, dT as a tuple + "interpolateTemperatureRangeHighTPhase": ( + 95., + 110., + 0.01, + ), ##Set by hand such that the lowest temperature is (slightly) below the actual minimum temperature + "interpolateTemperatureRangeLowTPhase": ( + 90., + 105., + 0.01, + ), ##Set by hand such that the highest temperature is (slightly) above the actual maximum temperature + "derivativeSettings": { + "temperatureVariationScale": 0.75, + "fieldValueVariationScale": 50.0, + }, ## Optimized settings for Standard Model + }, + ## Will probs need to adjust these once we decide on what our final implementation of the benchmark model is + expectedResults={ + "Tc": 102.57, + ## Phase locations at nucleation temperature + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([65.8969]), + "minimumTemperaturePhase1": 91.9013, + "maximumTemperaturePhase2": 102.844, + }, +) + +BM5 = BenchmarkPoint( + inputParams={ + "v0": 246.0, + "mW": 80.4, + "mZ": 91.2, + "mt": 174.0, + "g3": 1.2279920495357861, + "mH": 81.0, + }, + phaseInfo={ + "Tn": 113.575, + ## Guesses for phase locations + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([64.8777]), + }, + config={ + ## Give TMin, TMax, dT as a tuple + "interpolateTemperatureRangeHighTPhase": ( + 105., + 118., + 0.01, + ), ##Set by hand such that the lowest temperature is (slightly) below the actual minimum temperature + "interpolateTemperatureRangeLowTPhase": ( + 105., + 116., + 0.01, + ), ##Set by hand such that the highest temperature is (slightly) above the actual maximum temperature + "derivativeSettings": { + "temperatureVariationScale": 0.75, + "fieldValueVariationScale": 50.0, + }, ## Optimized settings for Standard Model + }, + ## Will probs need to adjust these once we decide on what our final implementation of the benchmark model is + expectedResults={ + "Tc": 113.795, + ## Phase locations at nucleation temperature + "phaseLocation1": WallGo.Fields([0.0]), + "phaseLocation2": WallGo.Fields([64.8777]), + "minimumTemperaturePhase1": 101.602, + "maximumTemperaturePhase2": 114.105, + }, +) + + +## +standardModelBenchmarks = [BM1, BM2, BM3, BM4, BM5] diff --git a/tests/Benchmarks/StandardModel/__init__.py b/tests/Benchmarks/StandardModel/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/Benchmarks/StandardModel/conftest.py b/tests/Benchmarks/StandardModel/conftest.py new file mode 100644 index 00000000..3928613f --- /dev/null +++ b/tests/Benchmarks/StandardModel/conftest.py @@ -0,0 +1,148 @@ +## StandardModel/conftest.py -- Configure singlet model specific tests. +import pytest +from typing import Tuple + +import WallGo + +from tests.BenchmarkPoint import BenchmarkPoint, BenchmarkModel + +from .Benchmarks_SM import standardModelBenchmarks + +from Models.StandardModel.standardModel import ( + StandardModel, +) + + +""" +FreeEnergy interpolations are initialized in the standardModelBenchmarkThermo_interpolate() fixture below. +Interpolations have a huge impact on performance but also affect the results somewhat. +Bottom line is that these tests ARE sensitive to details of the interpolations! +""" + + +"""----- Define fixtures for the standard model. + +NOTE: I'm giving these session scope so that their state is preserved between tests (cleared when pytest finishes). +This is helpful as things like FreeEnergy interpolations are slow, however it does make our tests a bit less transparent. +""" + + +@pytest.fixture(scope="session", params=standardModelBenchmarks, ids=["BM1", "BM2", "BM3", "BM4", "BM5"]) +def standardModelBenchmarkPoint(request: pytest.FixtureRequest) -> BenchmarkPoint: + yield request.param + + +@pytest.fixture(scope="session") +def standardModelBenchmarkModel(standardModelBenchmarkPoint: BenchmarkPoint) -> BenchmarkModel: + inputs = standardModelBenchmarkPoint.inputParams + model = StandardModel() + model.updateModel(inputs) + + yield BenchmarkModel(model, standardModelBenchmarkPoint) + + + +"""----- Fixtures for more complicated things that depend on the model/Veff. +I'm making these return also the original benchmark point so that it's easier to validate results, +eg. read from BenchmarkPoint.expectedResults""" + + +## This constructs thermodynamics without interpolating anything +@pytest.fixture(scope="session") +def standardModelBenchmarkThermo( + standardModelBenchmarkModel: BenchmarkModel, +) -> Tuple[WallGo.Thermodynamics, BenchmarkPoint]: + + BM = standardModelBenchmarkModel.benchmarkPoint + + Tn = BM.phaseInfo["Tn"] + phase1 = BM.expectedResults["phaseLocation1"] + phase2 = BM.expectedResults["phaseLocation2"] + + # I assume phase1 = high-T, phase2 = low-T. Would prefer to drop these labels though, + # so WallGo could safely assume that the transition is always phase1 -> phase2 + thermo = WallGo.Thermodynamics( + standardModelBenchmarkModel.model.getEffectivePotential(), + Tn, + phase2, + phase1, + ) + + thermo.freeEnergyHigh.disableAdaptiveInterpolation() + thermo.freeEnergyLow.disableAdaptiveInterpolation() + + thermo.freeEnergyHigh.minPossibleTemperature = 40.0 + thermo.freeEnergyHigh.maxPossibleTemperature = 60.0 + thermo.freeEnergyLow.minPossibleTemperature = 40.0 + thermo.freeEnergyLow.maxPossibleTemperature = 60.0 + + thermo.setExtrapolate() + + yield thermo, BM + + +## This is like the standardModelBenchmarkThermo fixture but interpolates the FreeEnergy objects over the temperature range specified in our BM input +@pytest.fixture(scope="session") +def standardModelBenchmarkThermo_interpolate( + standardModelBenchmarkModel: BenchmarkModel, +) -> Tuple[WallGo.Thermodynamics, BenchmarkPoint]: + + BM = standardModelBenchmarkModel.benchmarkPoint + + Tn = BM.phaseInfo["Tn"] + phase1 = BM.expectedResults["phaseLocation1"] + phase2 = BM.expectedResults["phaseLocation2"] + + ## I assume phase1 = high-T, phase2 = low-T. Would prefer to drop these labels though, + ## so WallGo could safely assume that the transition is always phase1 -> phase2 + thermo = WallGo.Thermodynamics( + standardModelBenchmarkModel.model.getEffectivePotential(), Tn, phase2, phase1 + ) + + ## Let's turn these off so that things are more transparent + thermo.freeEnergyHigh.disableAdaptiveInterpolation() + thermo.freeEnergyLow.disableAdaptiveInterpolation() + + """ Then manually interpolate """ + TMin, TMax, dT = BM.config["interpolateTemperatureRangeHighTPhase"] + + thermo.freeEnergyHigh.tracePhase(TMin, TMax, dT) + + TMin, TMax, dT = BM.config["interpolateTemperatureRangeLowTPhase"] + thermo.freeEnergyLow.tracePhase(TMin, TMax, dT) + + thermo.setExtrapolate() + + yield thermo, BM + + + +## Test for following minimum +@pytest.fixture(scope="session") +def standardModelBenchmarkFreeEnergy( + standardModelBenchmarkModel: BenchmarkModel, +) -> Tuple[WallGo.FreeEnergy, WallGo.FreeEnergy, BenchmarkPoint]: + + BM = standardModelBenchmarkModel.benchmarkPoint + + Tn = BM.phaseInfo["Tn"] + phase1 = BM.expectedResults["phaseLocation1"] + phase2 = BM.expectedResults["phaseLocation2"] + + # free energies for both phases + freeEnergy1 = WallGo.FreeEnergy( + standardModelBenchmarkModel.model.getEffectivePotential(), Tn, phase1 + ) + freeEnergy2 = WallGo.FreeEnergy( + standardModelBenchmarkModel.model.getEffectivePotential(), Tn, phase2 + ) + + + """ Then manually interpolate """ + TMin, TMax, dT = BM.config["interpolateTemperatureRangeHighTPhase"] + freeEnergy1.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False) + + TMin, TMax, dT = BM.config["interpolateTemperatureRangeLowTPhase"] + freeEnergy2.tracePhase(TMin, TMax, dT, rTol=1e-6, paranoid=False) + + yield freeEnergy1, freeEnergy2, BM \ No newline at end of file diff --git a/tests/Benchmarks/StandardModel/test_Tc.py b/tests/Benchmarks/StandardModel/test_Tc.py new file mode 100644 index 00000000..d6e7b289 --- /dev/null +++ b/tests/Benchmarks/StandardModel/test_Tc.py @@ -0,0 +1,24 @@ +import pytest +import numpy as np +from typing import Tuple + +from tests.BenchmarkPoint import BenchmarkPoint + +import WallGo + +@pytest.mark.slow +def test_standardModelThermodynamicsFindCriticalTemperature( + standardModelBenchmarkThermo_interpolate: Tuple[WallGo.Thermodynamics, BenchmarkPoint], +): + + thermodynamics, BM = standardModelBenchmarkThermo_interpolate + + Tc = thermodynamics.findCriticalTemperature( + dT=0.01, + rTol=1e-8, + paranoid=True, + ) + + expectedTc = BM.expectedResults["Tc"] + + assert Tc == pytest.approx(expectedTc, rel=1e-4) diff --git a/tests/Benchmarks/StandardModel/test_phaseTrace.py b/tests/Benchmarks/StandardModel/test_phaseTrace.py new file mode 100644 index 00000000..434e90db --- /dev/null +++ b/tests/Benchmarks/StandardModel/test_phaseTrace.py @@ -0,0 +1,23 @@ +import pytest +import numpy as np +from typing import Tuple + +from tests.BenchmarkPoint import BenchmarkPoint + +import WallGo + +@pytest.mark.slow +def test_standardModelPhaseTrace( + standardModelBenchmarkFreeEnergy: Tuple[WallGo.FreeEnergy, WallGo.FreeEnergy, BenchmarkPoint], +): + + + _, freeEnergyLowT, BM = standardModelBenchmarkFreeEnergy + + _,_,dT = BM.config["interpolateTemperatureRangeHighTPhase"] + + maxT = freeEnergyLowT.maxPossibleTemperature[0] + 2*dT + expectedMaxT = BM.expectedResults["maximumTemperaturePhase2"] + + + assert maxT == pytest.approx(expectedMaxT, rel=1e-3) \ No newline at end of file From db001b9c3ec26b9c680b4b2d796bdc26a0e72ab9 Mon Sep 17 00:00:00 2001 From: joonashir <76170033+joonashir@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:48:15 +0200 Subject: [PATCH 09/24] Merge pull request #30 from Wall-Go/vwError Changed the calculation of the wall velocity error --- src/WallGo/equationOfMotion.py | 130 ++++++++++++++++++++++++++------- 1 file changed, 102 insertions(+), 28 deletions(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index df079c5e..50e491cc 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -137,8 +137,10 @@ def __init__( ## Flag to detect if we were able to find the pressure self.successWallPressure = True - # also getting the LTE results - self.wallVelocityLTE = self.hydrodynamics.findvwLTE() + ## Setup lists used to estimate the pressure derivative + self.listVelocity = [] + self.listPressure = [] + self.listPressureError = [] def findWallVelocityDeflagrationHybrid( @@ -187,18 +189,10 @@ def findWallVelocityDeflagrationHybrid( logging.warning( """\n Warning: vmax is limited by the maximum temperature chosen in the phase tracing. WallGo might be unable to find the wall velocity. - Consider increasing the maximum temperature if no velocity is found. \n""" + Try increasing the maximum temperature! \n""" ) - results = self.solveWall(vmin, vmax, wallParams) - if (results.solutionType != ESolutionType.DEFLAGRATION and - 0 < self.wallVelocityLTE < 1 and - self.includeOffEq): - # If there is a LTE solution but no out-of-equilibrium one, retry with vmax - # set to the LTE velocity. - results = self.solveWall(vmin, self.wallVelocityLTE, wallParams) - - return results + return self.solveWall(vmin, vmax, wallParams) def findWallVelocityDetonation( self, @@ -441,6 +435,11 @@ def solveWall( Data class containing results. """ + ## Reset lists used to estimate the pressure derivative + self.listVelocity = [] + self.listPressure = [] + self.listPressureError = [] + results = WallGoResults() results.hasOutOfEquilibrium = self.includeOffEq @@ -468,12 +467,15 @@ def solveWall( EMviolationT33Max, ) = wallPressureResultsMax + # also getting the LTE results + wallVelocityLTE = self.hydrodynamics.findvwLTE() + # The pressure peak is not enough to stop the wall: no deflagration or # hybrid solution if pressureMax < 0: logging.info("Maximum pressure on wall is negative!") logging.info(f"{pressureMax=} {wallParamsMax=}") - results.setWallVelocities(None, None, self.wallVelocityLTE) + results.setWallVelocities(None, None, wallVelocityLTE) results.setWallParams(wallParamsMax) results.setHydroResults(hydroResultsMax) results.setBoltzmannBackground(boltzmannBackgroundMax) @@ -519,7 +521,7 @@ def solveWall( the phase transition cannot proceed. Something might be wrong with your potential.""" ) - results.setWallVelocities(None, None, self.wallVelocityLTE) + results.setWallVelocities(None, None, wallVelocityLTE) results.setWallParams(wallParamsMin) results.setHydroResults(hydroResultsMin) results.setBoltzmannBackground(boltzmannBackgroundMin) @@ -610,35 +612,61 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name wallParams, boltzmannResults, boltzmannBackground, hydroResults ) - # Computing the linearisation criteria + # minimum possible error in the wall speed + wallVelocityMinError = self.errTol + if self.includeOffEq: + # Computing the linearisation criteria criterion1, criterion2 = self.boltzmannSolver.checkLinearization( boltzmannResults.deltaF ) boltzmannResults.linearizationCriterion1 = criterion1 boltzmannResults.linearizationCriterion2 = criterion2 + + # Computing the out-of-equilibrium pressure to get the absolute error + vevLowT = boltzmannBackground.fieldProfiles.getFieldPoint(0) + vevHighT = boltzmannBackground.fieldProfiles.getFieldPoint(-1) + fields, dPhidz = self.wallProfile( + self.grid.xiValues, vevLowT, vevHighT, wallParams + ) + dVout = ( + np.sum( + [ + particle.totalDOFs + * particle.msqDerivative(fields) + * boltzmannResults.Deltas.Delta00.coefficients[i, :, None] + for i, particle in enumerate(self.particles) + ], + axis=0, + ) + / 2 + ) - # minimum possible error in the wall speed - wallVelocityMinError = self.errTol * optimizeResult.root + dVoutdz = np.sum(np.array(dVout * dPhidz), axis=1) - # estimating errors from truncation and comparison to finite differences - if self.includeOffEq: + # Create a Polynomial object to represent dVdz. Will be used to integrate it. + dVoutdzPoly = Polynomial(dVoutdz, self.grid) + + dzdchi, _, _ = self.grid.getCompactificationDerivatives() + offEquilPressureScale = np.abs(dVoutdzPoly.integrate(weight=-dzdchi)) + + # Compute the pressure derivative + pressureDerivative = self.estimatePressureDerivative(wallVelocity) + + # estimating errors from truncation and comparison to finite differences finiteDifferenceBoltzmannResults = self.getBoltzmannFiniteDifference() - # assuming nonequilibrium errors proportional to deviation from LTE - wallVelocityDeltaLTE = abs(wallVelocity - self.wallVelocityLTE) # the truncation error in the spectral method within Boltzmann - wallVelocityTruncationError = ( - boltzmannResults.truncationError * wallVelocityDeltaLTE + wallVelocityTruncationError = abs( + boltzmannResults.truncationError * offEquilPressureScale / pressureDerivative ) # the deviation from the finite difference method within Boltzmann delta00 = boltzmannResults.Deltas.Delta00.coefficients[0] delta00FD = finiteDifferenceBoltzmannResults.Deltas.Delta00.coefficients[0] errorFD = np.linalg.norm(delta00 - delta00FD) / np.linalg.norm(delta00) - wallVelocityDerivativeError = errorFD * wallVelocityDeltaLTE # if truncation waringin large, raise a warning if ( - wallVelocityTruncationError > wallVelocityDerivativeError + boltzmannResults.truncationError > errorFD and wallVelocityTruncationError > self.errTol ): warnings.warn("Truncation error large, increase N or M", RuntimeWarning) @@ -656,7 +684,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name results.setWallVelocities( wallVelocity=wallVelocity, wallVelocityError=wallVelocityError, - wallVelocityLTE=self.wallVelocityLTE, + wallVelocityLTE=wallVelocityLTE, ) results.setHydroResults(hydroResults) @@ -1018,7 +1046,11 @@ def wallPressure( logging.info(f"Final {pressure=:g}") logging.debug(f"Final {wallParams=}") - + + self.listVelocity.append(wallVelocity) + self.listPressure.append(pressure) + self.listPressureError.append(max(error, rtol * np.abs(pressure), atol)) + return ( pressure, wallParams, @@ -1541,8 +1573,50 @@ def estimateTanhError( dzdchi, _, _ = self.grid.getCompactificationDerivatives() eomSqResidual = eomSqPoly.integrate(axis=0, weight=dzdchi[:, None]) eomSqScaleIntegrated = eomSqScalePoly.integrate(axis=0, weight=dzdchi[:, None]) - + return eomSqResidual.coefficients / eomSqScaleIntegrated.coefficients + + def estimatePressureDerivative(self, wallVelocity: float) -> float: + """ + Estimates the derivative of the preessure with respect to the wall velocity from + a least square fit of the computed pressure to a line. Must have run + wallPressure at velocities close to wallVelocity before calling this function. + + Parameters + ---------- + wallVelocity : float + Wall velocity. + + Returns + ------- + float + Derivative of the pressure at wallVelocity. + + """ + # Number of pressure points + nbrPressure = len(self.listPressure) + + assert (len(self.listPressureError) == + len(self.listVelocity) == + nbrPressure >= 2), """The lists listVelocity, listPressure, + listPressureError must have the same length and + contain at least two elements.""" + + velocityErrorScale = self.errTol * wallVelocity + pressures = np.array(self.listPressure) + velocityDiff = np.array(self.listVelocity) - wallVelocity + # Farter points are exponentially suppressed to make sure they don't impact the + # estimate too much. + weightMatrix = np.diag(np.exp(-np.abs(velocityDiff/velocityErrorScale))/ + np.array(self.listPressureError)**2) + aMatrix = np.ones((nbrPressure, 2)) + aMatrix[:,1] = velocityDiff + + # Computes the derivative by fitting the pressure to a line + derivative = (np.linalg.inv(aMatrix.T @ weightMatrix @ aMatrix) + @ aMatrix.T @ weightMatrix @ pressures)[1] + + return derivative def wallProfile( self, From d9a71c5ca783029ef6175805b6a7795df79b60b5 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Mon, 18 Aug 2025 21:24:25 +0200 Subject: [PATCH 10/24] Merge pull request #32 from Wall-Go/examplePTTools Example file for exporting thermodynamics --- .../exampleOutputThermodynamics.py | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py diff --git a/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py b/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py new file mode 100644 index 00000000..fac91c78 --- /dev/null +++ b/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py @@ -0,0 +1,121 @@ +import sys +import pathlib +import numpy as np +import h5py + +# WallGo imports +import WallGo # Whole package, in particular we get WallGo._initializeInternal() + +# Add the SingletStandardModelZ2 folder to the path to import SingletSMZ2 +sys.path.append(str(pathlib.Path(__file__).resolve().parent)) +from singletStandardModelZ2 import SingletSMZ2 + + +def main() -> None: + + manager = WallGo.WallGoManager() + + # Model definition is done in the SingletSMZ2 class + model = SingletSMZ2() + manager.registerModel(model) + + inputParameters = { + "RGScale": 125.0, + "v0": 246.0, + "MW": 80.379, + "MZ": 91.1876, + "Mt": 173.0, + "g3": 1.2279920495357861, + "mh1": 125.0, + "mh2": 120.0, + "lHS": 0.9, + "lSS": 1.0, + } + + model.updateModel(inputParameters) + + # Creates a Thermodynamics object, containing all thermodynamic functions + # by tracing the high- and low-temperature phases. + # For temperatures outside of the range of existence of the phases, the + # thermodynamic functions are extrapolated using the template model. + manager.setupThermodynamicsHydrodynamics( + WallGo.PhaseInfo( + temperature=100.0, # nucleation temperature + phaseLocation1=WallGo.Fields([0.0, 200.0]), + phaseLocation2=WallGo.Fields([246.0, 0.0]), + ), + WallGo.VeffDerivativeSettings( + temperatureVariationScale=10.0, fieldValueVariationScale=[10.0, 10.0] + ), + ) + + Tcrit = manager.thermodynamics.findCriticalTemperature(dT = 0.1) + + # Generate tables for the thermodynamics functions of both phases. + # Note that if the minimum or maximum temperature chosen is outside of + # the range of existence of the phases, the extrapolation is used. + + # Temperature range and step for high-temperature phase + highTPhaseRange = (80.0, 140.0, 0.1) + # Temperature range and step for low-temperature phase + lowTPhaseRange = (80.0, 110.0, 0.1) + + # Create temperature arrays + temp_high = np.arange(highTPhaseRange[0], highTPhaseRange[1], highTPhaseRange[2]) + temp_low = np.arange(lowTPhaseRange[0], lowTPhaseRange[1], lowTPhaseRange[2]) + + # Evaluate thermodynamic functions for high-temperature phase + p_high = np.array([manager.thermodynamics.pHighT(T) for T in temp_high]) + e_high = np.array([manager.thermodynamics.eHighT(T) for T in temp_high]) + csq_high = np.array([manager.thermodynamics.csqHighT(T) for T in temp_high]) + + # Evaluate thermodynamic functions for low-temperature phase + p_low = np.array([manager.thermodynamics.pLowT(T) for T in temp_low]) + e_low = np.array([manager.thermodynamics.eLowT(T) for T in temp_low]) + csq_low = np.array([manager.thermodynamics.csqLowT(T) for T in temp_low]) + + # Get temperature limits; outside of these limits, extrapolation has been used + max_temp_high = manager.thermodynamics.freeEnergyHigh.maxPossibleTemperature[0] + min_temp_high = manager.thermodynamics.freeEnergyHigh.minPossibleTemperature[0] + max_temp_low = manager.thermodynamics.freeEnergyLow.maxPossibleTemperature[0] + min_temp_low = manager.thermodynamics.freeEnergyLow.minPossibleTemperature[0] + + # Create HDF5 file + filename = pathlib.Path(__file__).resolve().parent/"thermodynamics_data.h5" + + with h5py.File(filename, 'w') as f: + # Global attributes + f.attrs["model_label"] = "singletSMZ2" + f.attrs["critical_temperature"] = Tcrit + f.attrs["nucleation_temperature"] = 100. + + # High-temperature phase group + high_group = f.create_group("high_temperature_phase") + high_group.create_dataset("temperature", data=temp_high) + high_group.create_dataset("pressure", data=p_high) + high_group.create_dataset("energy_density", data=e_high) + high_group.create_dataset("sound_speed_squared", data=csq_high) + high_group.attrs["max_possible_temperature"] = max_temp_high + high_group.attrs["min_possible_temperature"] = min_temp_high + + # Low-temperature phase group + low_group = f.create_group("low_temperature_phase") + low_group.create_dataset("temperature", data=temp_low) + low_group.create_dataset("pressure", data=p_low) + low_group.create_dataset("energy_density", data=e_low) + low_group.create_dataset("sound_speed_squared", data=csq_low) + low_group.attrs["max_possible_temperature"] = max_temp_low + low_group.attrs["min_possible_temperature"] = min_temp_low + + print(f"Thermodynamics data saved to {filename}") + print("Model: singletSMZ2") + print(f"Critical temperature: {Tcrit:.2f} GeV") + print(f"High-T phase: {len(temp_high)} temperature points from {temp_high[0]:.1f} to {temp_high[-1]:.1f} GeV") + print(f"Low-T phase: {len(temp_low)} temperature points from {temp_low[0]:.1f} to {temp_low[-1]:.1f} GeV") + print(f"High-T phase valid range: {min_temp_high:.1f} to {max_temp_high:.1f} GeV") + print(f"Low-T phase valid range: {min_temp_low:.1f} to {max_temp_low:.1f} GeV") + + +## Don't run the main function if imported to another file +if __name__ == "__main__": + main() From 2d5824fdc30d8550197a7c3e732b41f480d07289 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:31:36 +0200 Subject: [PATCH 11/24] Merge pull request #34 from Wall-Go/collisionPair A fix to results.setViolationOfEMConservation --- src/WallGo/equationOfMotion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 50e491cc..13d357b9 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -527,7 +527,7 @@ def solveWall( results.setBoltzmannBackground(boltzmannBackgroundMin) results.setBoltzmannResults(boltzmannResultsMin) results.setViolationOfEMConservation( - EMviolationT30Min, EMviolationT33Min + (EMviolationT30Min, EMviolationT33Min) ) results.setSuccessState( False, From b0168d007e2899f842bf15f4abca69a5abeb5a83 Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Wed, 20 Aug 2025 16:02:45 +0100 Subject: [PATCH 12/24] Merge pull request #36 from Wall-Go/CHANGELOGv1.1.0 Changelog v1.1.0 --- CHANGELOG.rst | 14 ++++++++++++++ .../exampleCollisionDefs.py | 7 +++++++ .../exampleOutputThermodynamics.py | 8 ++++++++ docs/source/examples.rst | 2 ++ .../examples/singletScalarExtensionCollisions.rst | 6 ++++++ .../singletScalarExtensionThermodynamics.rst | 6 ++++++ docs/source/faqs.rst | 9 ++++++--- docs/source/index.rst | 2 +- docs/source/refs.bib | 8 +++++--- pyproject.toml | 1 - 10 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 docs/source/examples/singletScalarExtensionCollisions.rst create mode 100644 docs/source/examples/singletScalarExtensionThermodynamics.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 759d45bc..4c0653ca 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,20 @@ Changelog ================== +1.1.0 (2025-08-20) +================== + +* Phase tracing updates to improve algorithm stability. +* User may now pass the free energy of a phase as arrays. +* Spectral truncation options added to avoid aliasing, with an automatic method used by default. +* Error estimate for the wall speed updated to make it more theoretically sound. +* Linearization criterion updated so that `linearizationCriterion2` estimates the second order correction. +* Error estimate due to the Tanh ansatz now computed and added to `WallGoResults`. +* Accuracy of energy-momentum conservation computed, and printed for logging level `DEBUG`. +* New tests added for the Standard Model with light Higgs. +* `PTTools `_ example file added. + + 1.0.0 (2024-11-07) ================== diff --git a/Models/SingletStandardModel_Z2/exampleCollisionDefs.py b/Models/SingletStandardModel_Z2/exampleCollisionDefs.py index 18837342..fc2df125 100644 --- a/Models/SingletStandardModel_Z2/exampleCollisionDefs.py +++ b/Models/SingletStandardModel_Z2/exampleCollisionDefs.py @@ -1,3 +1,10 @@ +""" +This Python script, exampleCollisionDefs.py, +uses the implementation of the minimal Standard Model +extension in singletStandardModelZ2.py and adds example +definitions for the Boltzmann collision integrals for +WallGoCollision. +""" import WallGoCollision import pathlib import sys diff --git a/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py b/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py index fac91c78..6ccf9bb6 100644 --- a/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py +++ b/Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py @@ -1,3 +1,11 @@ +""" +This Python script, exampleOutputThermodynamics.py, +uses the implementation of the minimal Standard Model +extension in singletStandardModelZ2.py and gives methods +for saving the thermodynamics of the model for later use +in e.g. PTTools. +""" + import sys import pathlib import numpy as np diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 2ef751d4..bcc36841 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -10,6 +10,8 @@ Here we collect a number of different example model files. The Yukawa model file examples/wallGoExampleBase examples/standardModel examples/singletScalarExtension + examples/singletScalarExtensionCollisions + examples/singletScalarExtensionThermodynamics examples/manySinglets examples/inertDoubletModel examples/yukawa \ No newline at end of file diff --git a/docs/source/examples/singletScalarExtensionCollisions.rst b/docs/source/examples/singletScalarExtensionCollisions.rst new file mode 100644 index 00000000..05f4f710 --- /dev/null +++ b/docs/source/examples/singletScalarExtensionCollisions.rst @@ -0,0 +1,6 @@ +================================================ +Singlet Scalar Extension: Collisions Definitions +================================================ + +.. literalinclude:: ../../../Models/SingletStandardModel_Z2/exampleCollisionDefs.py + :language: py diff --git a/docs/source/examples/singletScalarExtensionThermodynamics.rst b/docs/source/examples/singletScalarExtensionThermodynamics.rst new file mode 100644 index 00000000..6c763f63 --- /dev/null +++ b/docs/source/examples/singletScalarExtensionThermodynamics.rst @@ -0,0 +1,6 @@ +=============================================== +Singlet Scalar Extension: Thermodynamics Output +=============================================== + +.. literalinclude:: ../../../Models/SingletStandardModel_Z2/exampleOutputThermodynamics.py + :language: py \ No newline at end of file diff --git a/docs/source/faqs.rst b/docs/source/faqs.rst index 2331078b..aae71072 100644 --- a/docs/source/faqs.rst +++ b/docs/source/faqs.rst @@ -13,7 +13,7 @@ General - **How should I cite WallGo?** WallGo is free and open source, but if you use WallGo in your work, we ask that you - support us by please citing the WallGo paper, `arXiv:2411.04970 `_. The complete BibTex citation from `Inspire `_ is:: + support us by please citing the WallGo paper, `JHEP 04 (2025) 101 `_. The complete BibTex citation from `Inspire `_ is:: @article{Ekstedt:2024fyq, author = "Ekstedt, Andreas and Gould, Oliver and Hirvonen, Joonas and Laurent, Benoit and Niemi, Lauri and Schicho, Philipp and van de Vis, Jorinde", @@ -22,8 +22,11 @@ General archivePrefix = "arXiv", primaryClass = "hep-ph", reportNumber = "CERN-TH-2024-174, DESY-24-162, HIP-2024-21/TH", - month = "11", - year = "2024" + doi = "10.1007/JHEP04(2025)101", + journal = "JHEP", + volume = "04", + pages = "101", + year = "2025" } diff --git a/docs/source/index.rst b/docs/source/index.rst index 196abf8d..1959b7fa 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -2,7 +2,7 @@ WallGo documentation ====================================== -WallGo is an open source code for the computation of the bubble wall velocity and bubble wall width in first-order cosmological phase transitions. If you use WallGo, please cite the WallGo paper `arXiv:2411.04970 `_. :footcite:p:`Ekstedt:2024fyq` +WallGo is an open source code for the computation of the bubble wall velocity and bubble wall width in first-order cosmological phase transitions. If you use WallGo, please cite the WallGo paper `JHEP 04 (2025) 101 `_. :footcite:p:`Ekstedt:2024fyq` As the universe cooled after the Hot Big Bang, it may have gone through any number of cosmological first-order phase transitions. Such transitions proceed via the nucleation and growth of bubbles, as shown in the image below. :footcite:p:`Weir_2016` The collisions of these bubbles may lead to an observable gravitational wave signal today, depending on the speed of the bubble walls as they collide. diff --git a/docs/source/refs.bib b/docs/source/refs.bib index ab915eb4..3e1e1ca6 100644 --- a/docs/source/refs.bib +++ b/docs/source/refs.bib @@ -54,7 +54,9 @@ @article{Ekstedt:2024fyq archivePrefix = "arXiv", primaryClass = "hep-ph", reportNumber = "CERN-TH-2024-174, DESY-24-162, HIP-2024-21/TH", - month = "11", - year = "2024", - journal = "arXiv" + doi = "10.1007/JHEP04(2025)101", + journal = "JHEP", + volume = "04", + pages = "101", + year = "2025" } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index eca889ea..afe3feb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,6 @@ dependencies = [ "h5py>=3.8.0", "numpy>=1.21.5", "scipy>=1.9.0", - "deprecated>=1.2.14", ] readme = "README.md" From 44ae2537f9be9b7c3849710e3c417c60d7f31c64 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Wed, 20 Aug 2025 17:13:47 +0200 Subject: [PATCH 13/24] Merge pull request #37 from Wall-Go/collisionPair2 Collision pair generation --- Models/Yukawa/yukawaCollisionForPairs.py | 164 +++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 Models/Yukawa/yukawaCollisionForPairs.py diff --git a/Models/Yukawa/yukawaCollisionForPairs.py b/Models/Yukawa/yukawaCollisionForPairs.py new file mode 100644 index 00000000..afa1417e --- /dev/null +++ b/Models/Yukawa/yukawaCollisionForPairs.py @@ -0,0 +1,164 @@ +""" +Demonstration of the computeIntegralsForPair methods. + +This script shows how to compute collision integrals for specific particle pairs +rather than the full set of out-of-equilibrium partice pairs. +""" + +import sys +import pathlib +import os + +# WallGo imports +import WallGo +import WallGoCollision + +# Add the Yukawa folder to the path to import YukawaModel +sys.path.append(str(pathlib.Path(__file__).resolve().parent)) +from yukawa import YukawaModel + + +def initCollisionModel(wallGoModel: "YukawaModel") -> "WallGoCollision.PhysicsModel": + """Initialize the Collision model and set the seed.""" + + import WallGoCollision # pylint: disable = C0415 + + # Collision integrations utilize Monte Carlo methods, so RNG is involved. + # We can set the global seed for collision integrals as follows. + # This is optional; by default the seed is 0. + WallGoCollision.setSeed(0) + + collisionModelDefinition = ( + WallGo.collisionHelpers.generateCollisionModelDefinition(wallGoModel) + ) + + # Add in-equilibrium particles that appear in collision processes + # The out-of-equilibrium particles are taken from the definition in the model file + phiParticle = WallGoCollision.ParticleDescription() + phiParticle.name = "phi" + phiParticle.index = 0 + phiParticle.bInEquilibrium = True + phiParticle.bUltrarelativistic = True + phiParticle.type = WallGoCollision.EParticleType.eBoson + # mass-sq function not required or used for UR particles, + # and it cannot be field-dependent for collisions. + # Backup of what the vacuum mass was intended to be: + + parameters = WallGoCollision.ModelParameters() + + parameters.add("y", wallGoModel.modelParameters["y"]) + parameters.add("gamma", wallGoModel.modelParameters["gamma"]) + parameters.add("lam", wallGoModel.modelParameters["lam"]) + parameters.add("v", 0.0) + + # fermion asymptotic thermal mass^2 (twice the static thermal mass) + # in units of T + parameters.add( + "mf2", 1 / 8 * wallGoModel.modelParameters["y"] ** 2 + ) + # scalar thermal mass^2 in units of T + parameters.add( + "ms2", + +wallGoModel.modelParameters["lam"] / 24.0 + + wallGoModel.modelParameters["y"] ** 2.0 / 6.0, + ) + + collisionModelDefinition.defineParticleSpecies(phiParticle) + collisionModelDefinition.defineParameters(parameters) + + collisionModel = WallGoCollision.PhysicsModel(collisionModelDefinition) + + return collisionModel + +def demonstrateComputeIntegralsForPair(collision_model: "WallGoCollision.PhysicsModel", save_dir: str | None = None) -> None: + """Demonstrate computing collision integrals for specific particle pairs using computeIntegralsForPair().""" + + gridSize = 3 # Small grid for faster demonstration + + # Set default save directory if not provided + if save_dir is None: + save_dir = f"CollisionOutput_N{gridSize}_Pairs" + + # Create output directory + os.makedirs(save_dir, exist_ok=True) + + # Load matrix elements FIRST (before creating collision tensor) + print("Loading matrix elements...") + matrix_element_file = pathlib.Path(__file__).resolve().parent / "MatrixElements" / "matrixElements.yukawa.json" + bShouldPrintMatrixElements = True + if not collision_model.loadMatrixElements(str(matrix_element_file), bShouldPrintMatrixElements): + print(f"FATAL: Failed to load matrix elements from {matrix_element_file}") + return {} + + # Create collision tensor AFTER loading matrix elements + print("Creating collision tensor...") + collisionTensor = collision_model.createCollisionTensor(gridSize) + + # Configure integration options + options = WallGoCollision.IntegrationOptions() + options.maxIntegrationMomentum = 10 # Reduced for speed + options.absoluteErrorGoal = 1e-6 + options.relativeErrorGoal = 1e-1 + options.maxTries = 20 + options.calls = 10000 # Reduced for speed + options.bIncludeStatisticalErrors = True + + collisionTensor.setIntegrationOptions(options) + + # Set verbosity for demonstration + verbosity = WallGoCollision.CollisionTensorVerbosity() + verbosity.bPrintElapsedTime = True + verbosity.progressReportPercentage = 0.5 + verbosity.bPrintEveryElement = False + collisionTensor.setIntegrationVerbosity(verbosity) + + # Demonstrate computing collision integrals for multiple particle pairs + print("\n5. Computing collision integrals for particle pairs") + + # Define the particle pairs to compute + particle_pairs = [("psiL", "psiL"), ("psiR", "psiR")] + + results = {} + + for particle1, particle2 in particle_pairs: + print(f"\nComputing collision integrals for pair: {particle1} - {particle2}") + + # Use computeIntegralsForPair to compute the collision integrals for this specific pair + pair_result = collisionTensor.computeIntegralsForPair(particle1, particle2) + + if pair_result is not None: + print(f"Successfully computed integrals for {particle1}-{particle2}") + + # Save directly to the main directory + filename = os.path.join(save_dir, f"{particle1}_{particle2}.h5") + print(f"Saving to: {filename}") + + pair_result.writeToHDF5(filename) + print(f"Successfully saved {particle1}-{particle2}") + + results[f"{particle1}_{particle2}"] = pair_result + else: + print(f"Failed to compute integrals for {particle1}-{particle2} (returned None)") + + return + + +if __name__ == "__main__": + + # Initialize the Yukawa model + wallGoModel = YukawaModel() + + # Set example parameters + inputParameters = { + "sigma": 0.0, + "msq": 1.0, + "gamma": -1.2, + "lam": 0.10, + "y": 0.55, + "mf": 0.30, + } + wallGoModel.modelParameters.update(inputParameters) + + collisionModel = initCollisionModel(wallGoModel) + + results = demonstrateComputeIntegralsForPair(collisionModel) From 0510297f9799d2d405273714499ba7cc83093cc1 Mon Sep 17 00:00:00 2001 From: Jorinde van de Vis Date: Wed, 20 Aug 2025 17:54:23 +0200 Subject: [PATCH 14/24] Remove some files --- .../BM11HighT.txt | 397 --- .../BM11LowT.txt | 2621 ----------------- .../scanResults/BM1_05v_top.npy | Bin 3623 -> 0 bytes .../scanResults/BM3_05v_top.npy | Bin 5081 -> 0 bytes 4 files changed, 3018 deletions(-) delete mode 100644 Models/InertDoubletModelApplicationsPaper/BM11HighT.txt delete mode 100644 Models/InertDoubletModelApplicationsPaper/BM11LowT.txt delete mode 100644 Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy delete mode 100644 Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy diff --git a/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt b/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt deleted file mode 100644 index 2c94ef14..00000000 --- a/Models/InertDoubletModelApplicationsPaper/BM11HighT.txt +++ /dev/null @@ -1,397 +0,0 @@ -123.3 0. -2.798802311130195e9 -123.35 0. -2.8033338587535367e9 -123.39999999999999 0. -2.8078709177667623e9 -123.45 0. -2.8124134926248245e9 -123.5 0. -2.8169615877844954e9 -123.55 0. -2.8215152077043686e9 -123.6 0. -2.8260743568448625e9 -123.64999999999999 0. -2.8306390396682115e9 -123.7 0. -2.835209260638475e9 -123.75 0. -2.8397850242215295e9 -123.8 0. -2.8443663348850775e9 -123.85 0. -2.8489531970986385e9 -123.89999999999999 0. -2.8535456153335557e9 -123.95 0. -2.858143594062993e9 -124. 0. -2.862747137761931e9 -124.05 0. -2.867356250907177e9 -124.1 0. -2.8719709379773555e9 -124.14999999999999 0. -2.876591203452913e9 -124.2 0. -2.881217051816119e9 -124.25 0. -2.8858484875510583e9 -124.3 0. -2.8904855151436415e9 -124.35 0. -2.8951281390815973e9 -124.39999999999999 0. -2.899776363854477e9 -124.45 0. -2.904430193953652e9 -124.5 0. -2.90908963387231e9 -124.55 0. -2.9137546881054673e9 -124.6 0. -2.9184253611499534e9 -124.64999999999999 0. -2.9231016575044236e9 -124.7 0. -2.9277835816693516e9 -124.75 0. -2.9324711381470304e9 -124.8 0. -2.9371643314415736e9 -124.85 0. -2.941863166058918e9 -124.89999999999999 0. -2.946567624176511e9 -124.95 0. -2.951277664330914e9 -125. 0. -2.9559933591655707e9 -125.05 0. -2.960714713201627e9 -125.1 0. -2.9654417309620423e9 -125.14999999999999 0. -2.970174416971586e9 -125.2 0. -2.974912775756848e9 -125.25 0. -2.979656811846223e9 -125.3 0. -2.984406529769925e9 -125.35 0. -2.989161934059981e9 -125.39999999999999 0. -2.9939230292502327e9 -125.45 0. -2.9986898198763347e9 -125.5 0. -3.003462310475752e9 -125.55 0. -3.0082405055877666e9 -125.6 0. -3.0130244097534747e9 -125.64999999999999 0. -3.0178140275157843e9 -125.7 0. -3.0226093634194193e9 -125.75 0. -3.027410422010912e9 -125.8 0. -3.0322172078386145e9 -125.85 0. -3.0370297254526896e9 -125.89999999999999 0. -3.041847979405113e9 -125.95 0. -3.0466719742496777e9 -126. 0. -3.0515017145419836e9 -126.05 0. -3.056337204839451e9 -126.1 0. -3.0611784497013087e9 -126.14999999999999 0. -3.0660254536886024e9 -126.2 0. -3.070878221364191e9 -126.25 0. -3.0757367572927437e9 -126.3 0. -3.0806010660407467e9 -126.35 0. -3.0854711521764984e9 -126.39999999999999 0. -3.090347020270111e9 -126.45 0. -3.095228674893512e9 -126.5 0. -3.100116120620436e9 -126.55 0. -3.1050093620264378e9 -126.6 0. -3.1099084036888824e9 -126.64999999999999 0. -3.1148132501869516e9 -126.7 0. -3.1197239061016374e9 -126.75 0. -3.124640376015743e9 -126.8 0. -3.1295626645138903e9 -126.85 0. -3.1344907761825123e9 -126.89999999999999 0. -3.1394247156098547e9 -126.95 0. -3.1443644873859806e9 -127. 0. -3.149310096102758e9 -127.05 0. -3.1542615463538766e9 -127.1 0. -3.159218842734835e9 -127.14999999999999 0. -3.1641819898429475e9 -127.2 0. -3.169150992277342e9 -127.25 0. -3.1741258546389556e9 -127.3 0. -3.179106581530543e9 -127.35 0. -3.184093177556671e9 -127.39999999999999 0. -3.189085647323719e9 -127.45 0. -3.1940839954398823e9 -127.5 0. -3.199088226515165e9 -127.55 0. -3.2040983451613874e9 -127.6 0. -3.209114355992183e9 -127.64999999999999 0. -3.2141362636229987e9 -127.7 0. -3.219164072671095e9 -127.75 0. -3.2241977877555428e9 -127.8 0. -3.2292374134972286e9 -127.85 0. -3.234282954518851e9 -127.89999999999999 0. -3.239334415444926e9 -127.95 0. -3.244391800901778e9 -128. 0. -3.249455115517544e9 -128.05 0. -3.2545243639221783e9 -128.1 0. -3.2595995507474437e9 -128.15 0. -3.264680680626925e9 -128.2 0. -3.269767758196006e9 -128.25 0. -3.2748607880918984e9 -128.3 0. -3.279959774953618e9 -128.35 0. -3.2850647234219933e9 -128.4 0. -3.2901756381396737e9 -128.45 0. -3.2952925237511115e9 -128.5 0. -3.3004153849025836e9 -128.55 0. -3.305544226242171e9 -128.6 0. -3.310679052419766e9 -128.65 0. -3.315819868087087e9 -128.7 0. -3.3209666778976507e9 -128.75 0. -3.3261194865067973e9 -128.8 0. -3.331278298571675e9 -128.85 0. -3.3364431187512436e9 -128.9 0. -3.341613951706284e9 -128.95 0. -3.3467908020993776e9 -129. 0. -3.351973674594933e9 -129.05 0. -3.3571625738591623e9 -129.1 0. -3.3623575045600896e9 -129.15 0. -3.3675584713675613e9 -129.2 0. -3.3727654789532256e9 -129.25 0. -3.3779785319905562e9 -129.3 0. -3.383197635154827e9 -129.35 0. -3.388422793123131e9 -129.4 0. -3.393654010574377e9 -129.45 0. -3.398891292189281e9 -129.5 0. -3.404134642650377e9 -129.55 0. -3.409384066642008e9 -129.6 0. -3.41463956885033e9 -129.65 0. -3.4199011539633174e9 -129.7 0. -3.4251688266707487e9 -129.75 0. -3.430442591664227e9 -129.8 0. -3.4357224536371574e9 -129.85 0. -3.4410084172847595e9 -129.9 0. -3.4463004873040743e9 -129.95 0. -3.4515986683939443e9 -130. 0. -3.4569029652550354e9 -130.05 0. -3.4622133825898194e9 -130.1 0. -3.4675299251025805e9 -130.15 0. -3.472852597499423e9 -130.2 0. -3.478181404488254e9 -130.25 0. -3.483516350778805e9 -130.3 0. -3.4888574410826106e9 -130.35 0. -3.4942046801130176e9 -130.4 0. -3.4995580725851994e9 -130.45 0. -3.5049176232161236e9 -130.5 0. -3.5102833367245874e9 -130.55 0. -3.515655217831188e9 -130.6 0. -3.5210332712583394e9 -130.65 0. -3.5264175017302756e9 -130.7 0. -3.53180791397303e9 -130.75 0. -3.5372045127144623e9 -130.8 0. -3.542607302684236e9 -130.85 0. -3.5480162886138277e9 -130.9 0. -3.553431475236533e9 -130.95 0. -3.558852867287454e9 -131. 0. -3.564280469503512e9 -131.05 0. -3.569714286623433e9 -131.1 0. -3.5751543233877583e9 -131.15 0. -3.580600584538849e9 -131.2 0. -3.5860530748208675e9 -131.25 0. -3.5915117989797997e9 -131.3 0. -3.5969767617634373e9 -131.35 0. -3.602447967921383e9 -131.4 0. -3.607925422205063e9 -131.45 0. -3.6134091293677006e9 -131.5 0. -3.6188990941643486e9 -131.55 0. -3.62439532135186e9 -131.6 0. -3.6298978156889014e9 -131.65 0. -3.6354065819359612e9 -131.7 0. -3.6409216248553286e9 -131.75 0. -3.646442949211118e9 -131.8 0. -3.651970559769245e9 -131.85 0. -3.657504461297442e9 -131.9 0. -3.6630446585652575e9 -131.95 0. -3.668591156344047e9 -132. 0. -3.6741439594069834e9 -132.05 0. -3.67970307252905e9 -132.1 0. -3.685268500487039e9 -132.15 0. -3.690840248059565e9 -132.2 0. -3.696418320027042e9 -132.25 0. -3.7020027211717124e9 -132.3 0. -3.707593456277617e9 -132.35 0. -3.713190530130613e9 -132.4 0. -3.7187939475183764e9 -132.45 0. -3.7244037132303877e9 -132.5 0. -3.7300198320579457e9 -132.55 0. -3.73564230879416e9 -132.6 0. -3.741271148233947e9 -132.65 0. -3.7469063551740484e9 -132.7 0. -3.7525479344130025e9 -132.75 0. -3.758195890751177e9 -132.8 0. -3.76385022899074e9 -132.85 0. -3.76951095393567e9 -132.9 0. -3.775178070391772e9 -132.95 0. -3.7808515831666484e9 -133. 0. -3.7865314970697293e9 -133.05 0. -3.792217816912241e9 -133.1 0. -3.797910547507231e9 -133.15 0. -3.8036096936695633e9 -133.2 0. -3.8093152602159023e9 -133.25 0. -3.8150272519647374e9 -133.3 0. -3.8207456737363634e9 -133.35 0. -3.8264705303528867e9 -133.4 0. -3.832201826638232e9 -133.45 0. -3.837939567418128e9 -133.5 0. -3.8436837575201283e9 -133.55 0. -3.8494344017735868e9 -133.6 0. -3.8551915050096703e9 -133.65 0. -3.8609550720613694e9 -133.7 0. -3.866725107763475e9 -133.75 0. -3.872501616952597e9 -133.8 0. -3.8782846044671574e9 -133.85 0. -3.8840740751473823e9 -133.9 0. -3.889870033835326e9 -133.95 0. -3.8956724853748364e9 -134. 0. -3.901481434611593e9 -134.05 0. -3.907296886393073e9 -134.1 0. -3.9131188455685663e9 -134.15 0. -3.9189473169891887e9 -134.2 0. -3.9247823055078526e9 -134.25 0. -3.9306238159792953e9 -134.3 0. -3.9364718532600565e9 -134.35 0. -3.942326422208491e9 -134.4 0. -3.948187527684772e9 -134.45 0. -3.9540551745508757e9 -134.5 0. -3.959929367670599e9 -134.55 0. -3.965810111909546e9 -134.6 0. -3.97169741213513e9 -134.65 0. -3.9775912732165866e9 -134.7 0. -3.9834917000249534e9 -134.75 0. -3.989398697433091e9 -134.8 0. -3.9953122703156624e9 -134.85 0. -4.0012324235491424e9 -134.9 0. -4.0071591620118284e9 -134.95 0. -4.0130924905838203e9 -135. 0. -4.0190324141470356e9 -135.05 0. -4.024978937585202e9 -135.1 0. -4.0309320657838573e9 -135.15 0. -4.0368918036303587e9 -135.2 0. -4.0428581560138636e9 -135.25 0. -4.048831127825355e9 -135.3 0. -4.05481072395762e9 -135.35 0. -4.060796949305256e9 -135.4 0. -4.066789808764683e9 -135.45 0. -4.072789307234118e9 -135.5 0. -4.07879544961361e9 -135.55 0. -4.0848082408050003e9 -135.6 0. -4.09082768571195e9 -135.65 0. -4.0968537882232585e9 -135.7 0. -4.102886554242669e9 -135.75 0. -4.1089259886975994e9 -135.8 0. -4.1149720964989552e9 -135.85 0. -4.1210248825594606e9 -135.9 0. -4.1270843517936525e9 -135.95 0. -4.133150509117876e9 -136. 0. -4.139223359450295e9 -136.05 0. -4.14530290771088e9 -136.1 0. -4.1513891588214083e9 -136.15 0. -4.1574821177054853e9 -136.2 0. -4.163581789288513e9 -136.25 0. -4.169688178497715e9 -136.3 0. -4.1758012902621226e9 -136.35 0. -4.181921129512577e9 -136.4 0. -4.188047701181741e9 -136.45 0. -4.194181010204076e9 -136.5 0. -4.2003210615158677e9 -136.55 0. -4.206467860055208e9 -136.6 0. -4.2126214107619967e9 -136.65 0. -4.218781718577958e9 -136.7 0. -4.2249487884466133e9 -136.75 0. -4.2311226253133125e9 -136.8 0. -4.237303234125201e9 -136.85 0. -4.243490619831243e9 -136.9 0. -4.249684787382222e9 -136.95 0. -4.25588574173072e9 -137. 0. -4.2620934878311434e9 -137.05 0. -4.268308030639703e9 -137.1 0. -4.274529375114421e9 -137.15 0. -4.280757526215139e9 -137.2 0. -4.286992488903501e9 -137.25 0. -4.293234268142974e9 -137.3 0. -4.2994828688988285e9 -137.35 0. -4.305738296138144e9 -137.4 0. -4.312000554829824e9 -137.45 0. -4.318269649944574e9 -137.5 0. -4.324545586454918e9 -137.55 0. -4.330828369335187e9 -137.6 0. -4.3371180035615225e9 -137.65 0. -4.343414494111887e9 -137.7 0. -4.349717845966042e9 -137.75 0. -4.356028064105576e9 -137.8 0. -4.362345153513878e9 -137.85 0. -4.3686691191761465e9 -137.9 0. -4.374999966079408e9 -137.95 0. -4.381337699212482e9 -138. 0. -4.387682323566017e9 -138.05 0. -4.39403384413246e9 -138.1 0. -4.400392265906072e9 -138.15 0. -4.406757593882935e9 -138.2 0. -4.413129833060932e9 -138.25 0. -4.419508988439767e9 -138.3 0. -4.425895065020949e9 -138.35 0. -4.432288067807799e9 -138.4 0. -4.438688001805457e9 -138.45 0. -4.4450948720208645e9 -138.5 0. -4.451508683462789e9 -138.55 0. -4.457929441141794e9 -138.6 0. -4.464357150070262e9 -138.65 0. -4.470791815262393e9 -138.7 0. -4.477233441734186e9 -138.75 0. -4.4836820345034685e9 -138.8 0. -4.490137598589865e9 -138.85 0. -4.496600139014814e9 -138.9 0. -4.503069660801577e9 -138.95 0. -4.509546168975212e9 -139. 0. -4.516029668562603e9 -139.05 0. -4.522520164592436e9 -139.1 0. -4.529017662095208e9 -139.15 0. -4.535522166103241e9 -139.2 0. -4.542033681650648e9 -139.25 0. -4.548552213773379e9 -139.3 0. -4.555077767509172e9 -139.35 0. -4.561610347897587e9 -139.4 0. -4.568149959980003e9 -139.45 0. -4.574696608799596e9 -139.5 0. -4.581250299401366e9 -139.55 0. -4.587811036832119e9 -139.6 0. -4.594378826140469e9 -139.65 0. -4.600953672376854e9 -139.7 0. -4.607535580593509e9 -139.75 0. -4.614124555844496e9 -139.8 0. -4.620720603185677e9 -139.85 0. -4.627323727674725e9 -139.9 0. -4.633933934371135e9 -139.95 0. -4.640551228336203e9 -140. 0. -4.647175614633051e9 -140.05 0. -4.653807098326595e9 -140.1 0. -4.660445684483571e9 -140.15 0. -4.667091378172533e9 -140.2 0. -4.673744184463832e9 -140.25 0. -4.680404108429647e9 -140.3 0. -4.68707113514934e9 -140.35 0. -4.693745286726935e9 -140.4 0. -4.700426571167453e9 -140.45 0. -4.70711499355129e9 -140.5 0. -4.713810558960669e9 -140.55 0. -4.720513272479611e9 -140.6 0. -4.7272231391939535e9 -140.65 0. -4.733940164191351e9 -140.7 0. -4.740664352561255e9 -140.75 0. -4.747395709394944e9 -140.8 0. -4.754134239785496e9 -140.85 0. -4.760879948827799e9 -140.9 0. -4.767632841618563e9 -140.95 0. -4.774392923256295e9 -141. 0. -4.78116019884133e9 -141.05 0. -4.787934673475796e9 -141.1 0. -4.794716352263639e9 -141.15 0. -4.801505240310624e9 -141.2 0. -4.808301342724312e9 -141.25 0. -4.81510466461409e9 -141.3 0. -4.821915211091145e9 -141.35 0. -4.828732987268474e9 -141.4 0. -4.835557998260898e9 -141.45 0. -4.842390249185031e9 -141.5 0. -4.849229745159315e9 -141.55 0. -4.856076491303994e9 -141.6 0. -4.862930492741117e9 -141.65 0. -4.869791754594559e9 -141.7 0. -4.876660281989991e9 -141.75 0. -4.88353608005491e9 -141.8 0. -4.890419153918609e9 -141.85 0. -4.897309508712196e9 -141.9 0. -4.904207149568601e9 -141.95 0. -4.911112081622547e9 -142. 0. -4.918024310010584e9 -142.05 0. -4.924943839871062e9 -142.1 0. -4.931870676344145e9 -142.15 0. -4.938804824571811e9 -142.2 0. -4.945746289697844e9 -142.25 0. -4.952695076867846e9 -142.3 0. -4.959651191229223e9 -142.35 0. -4.966614637931187e9 -142.4 0. -4.973585422124779e9 -142.45 0. -4.98056354896283e9 -142.5 0. -4.9875490236e9 -142.55 0. -4.994541851192749e9 -142.6 0. -5.0015420368993435e9 -142.65 0. -5.008549585879878e9 -142.7 0. -5.015564503296237e9 -142.75 0. -5.022586794312137e9 -142.8 0. -5.029616464093088e9 -142.85 0. -5.036653517806416e9 -142.9 0. -5.043697960621265e9 -142.95 0. -5.050749797708578e9 -143. 0. -5.057809034241123e9 -143.05 0. -5.064875675393463e9 -143.1 0. -5.071949726341982e9 \ No newline at end of file diff --git a/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt b/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt deleted file mode 100644 index 5f610f8e..00000000 --- a/Models/InertDoubletModelApplicationsPaper/BM11LowT.txt +++ /dev/null @@ -1,2621 +0,0 @@ -112. 167.57865210639014 -1.921533883472978e9 -112.005 167.56555305802544 -1.9218665282199435e9 -112.01 167.55229765104897 -1.9221992189852955e9 -112.015 167.53903837895177 -1.9225319557860675e9 -112.02 167.52577524019344 -1.922864738626681e9 -112.025 167.51250823323235 -1.9231975675115566e9 -112.03 167.49923735652578 -1.9235304424451127e9 -112.035 167.48596260853003 -1.9238633634317708e9 -112.04 167.4726839876999 -1.9241963304759517e9 -112.045 167.45940149248915 -1.9245293435820756e9 -112.05 167.44611512135046 -1.9248624027545652e9 -112.055 167.43282487273515 -1.9251955079978414e9 -112.06 167.41953074509365 -1.9255286593163252e9 -112.065 167.40623273687513 -1.9258618567144387e9 -112.07 167.39293084652735 -1.9261951001966054e9 -112.075 167.37962507249713 -1.926528389767248e9 -112.08 167.3663154132302 -1.926861725430788e9 -112.085 167.35300186717083 -1.9271951071916487e9 -112.09 167.33968443276225 -1.927528535054255e9 -112.095 167.32636310844663 -1.9278620090230289e9 -112.1 167.313037892665 -1.928195529102394e9 -112.105 167.2997087838567 -1.928529095296777e9 -112.11 167.2863757804606 -1.9288627076105993e9 -112.115 167.27303888091384 -1.9291963660482872e9 -112.12 167.25969808365244 -1.929530070614266e9 -112.125 167.24635338711192 -1.9298638213129587e9 -112.13 167.23300478972553 -1.9301976181487927e9 -112.135 167.21965228992616 -1.9305314611261942e9 -112.14 167.20629588614517 -1.9308653502495868e9 -112.145 167.19293557681283 -1.9311992855233989e9 -112.15 167.1795713603579 -1.9315332669520564e9 -112.155 167.16620323520874 -1.931867294539985e9 -112.16 167.1528311997915 -1.9322013682916126e9 -112.165 167.13945525253175 -1.9325354882113671e9 -112.17 167.12607539185402 -1.9328696543036754e9 -112.175 167.11269161618108 -1.9332038665729647e9 -112.18 167.0993039239349 -1.9335381250236642e9 -112.185 167.08591231353614 -1.9338724296602006e9 -112.19 167.07251678340427 -1.9342067804870038e9 -112.195 167.05911733195754 -1.9345411775085027e9 -112.2 167.0457139576129 -1.9348756207291262e9 -112.205 167.0323066587863 -1.9352101101533031e9 -112.21 167.01889543389242 -1.9355446457854636e9 -112.215 167.00548028134457 -1.9358792276300378e9 -112.22 166.99206119955505 -1.9362138556914554e9 -112.225 166.9786381869349 -1.9365485299741464e9 -112.23 166.96521124189374 -1.936883250482543e9 -112.235 166.9517803628404 -1.9372180172210736e9 -112.24 166.93834554818213 -1.9375528301941712e9 -112.245 166.92490679632502 -1.9378876894062684e9 -112.25 166.91741499677246 -1.9382225947646759e9 -112.255 166.90930400702067 -1.938557545253676e9 -112.26 166.89585662488105 -1.9388925419165583e9 -112.265 166.88240526244442 -1.9392275848357449e9 -112.27 166.86894991808188 -1.9395626740156755e9 -112.275 166.8554905901629 -1.9398978094607882e9 -112.28 166.8420272770562 -1.9402329911755178e9 -112.285 166.82855997712878 -1.9405682191643038e9 -112.29 166.8150886887468 -1.9409034934315848e9 -112.295 166.80161341027485 -1.9412388139817972e9 -112.3 166.78813414007644 -1.941574180819381e9 -112.305 166.77465087651365 -1.9419095939487762e9 -112.31 166.76116361794746 -1.9422450533744192e9 -112.315 166.74767236273735 -1.942580559100751e9 -112.32 166.7341771092419 -1.942916111132211e9 -112.325 166.72067785581805 -1.9432517094732406e9 -112.33 166.70717460082184 -1.9435873541282768e9 -112.335 166.69366734260774 -1.9439230451017625e9 -112.34 166.68015607952896 -1.9442587823981388e9 -112.345 166.6666408099377 -1.9445945660218449e9 -112.35 166.65312153218457 -1.944930395977323e9 -112.355 166.639598244619 -1.9452662722690148e9 -112.36 166.62607094558942 -1.945602194901361e9 -112.365 166.6125396334425 -1.9459381638788044e9 -112.37 166.59900430652397 -1.946274179205789e9 -112.375 166.58546496317823 -1.946610240886755e9 -112.38 166.57192160174836 -1.946946348926145e9 -112.385 166.55837422057596 -1.9472825033284051e9 -112.39 166.54482281800173 -1.9476187040979757e9 -112.395 166.53126739236487 -1.9479549512393012e9 -112.4 166.51770794200326 -1.9482912447568269e9 -112.405 166.50414446525346 -1.9486275846549945e9 -112.41 166.49057696045085 -1.9489639709382508e9 -112.415 166.4770054259296 -1.9493004036110404e9 -112.42 166.46342986002222 -1.9496368826778054e9 -112.425 166.4498502610604 -1.9499734081429942e9 -112.43 166.43626662737415 -1.9503099800110521e9 -112.435 166.42267895729248 -1.9506465982864227e9 -112.44 166.4090872491428 -1.9509832629735534e9 -112.445 166.39549150125146 -1.9513199740768902e9 -112.45 166.38189171194327 -1.9516567316008816e9 -112.455 166.3682878795421 -1.951993535549971e9 -112.46 166.35468000237015 -1.9523303859286075e9 -112.465 166.34106807874838 -1.9526672827412395e9 -112.47 166.32745210699667 -1.9530042259923124e9 -112.475 166.3138320854334 -1.953341215686275e9 -112.48 166.30020801237566 -1.9536782518275764e9 -112.485 166.28657988613918 -1.9540153344206634e9 -112.49 166.27294770503852 -1.9543524634699855e9 -112.495 166.25931146738688 -1.9546896389799926e9 -112.5 166.24567117149581 -1.955026860955132e9 -112.505 166.2320268156761 -1.9553641293998547e9 -112.51 166.2183783982369 -1.9557014443186102e9 -112.515 166.20472591748606 -1.9560388057158473e9 -112.52 166.19106937173012 -1.9563762135960178e9 -112.525 166.17740875927436 -1.9567136679635725e9 -112.53 166.1637440784226 -1.957051168822961e9 -112.535 166.1500753274774 -1.957388716178635e9 -112.54 166.13640250474006 -1.9577263100350466e9 -112.545 166.12272560851045 -1.9580639503966453e9 -112.55 166.1090446370872 -1.9584016372678845e9 -112.555 166.09535958876734 -1.9587393706532176e9 -112.56 166.08167046184718 -1.959077150557094e9 -112.565 166.06797725462096 -1.9594149769839687e9 -112.57 166.05427996538202 -1.9597528499382942e9 -112.575 166.04057859242218 -1.9600907694245238e9 -112.58 166.026873134032 -1.9604287354471107e9 -112.585 166.01316358850073 -1.960766748010508e9 -112.59 165.9994499541162 -1.961104807119172e9 -112.595 165.98573222916488 -1.961442912777554e9 -112.6 165.97201041193208 -1.9617810649901104e9 -112.605 165.95828450070135 -1.9621192637612972e9 -112.61 165.94455449375536 -1.9624575090955667e9 -112.615 165.93082038937519 -1.9627958009973752e9 -112.62 165.9170821858405 -1.9631341394711807e9 -112.625 165.90333988142982 -1.9634725245214353e9 -112.63 165.88959347442008 -1.9638109561525974e9 -112.635 165.87584296308697 -1.964149434369124e9 -112.64 165.86208834570485 -1.9644879591754704e9 -112.645 165.84832962054662 -1.964826530576094e9 -112.65 165.841524119308 -1.9651651484456549e9 -112.655 165.82876157772208 -1.9655038127493327e9 -112.66 165.8149928448007 -1.9658425236577995e9 -112.665 165.80121999492272 -1.966181281178208e9 -112.67 165.7874430263503 -1.9665200853150148e9 -112.675 165.77366193734397 -1.9668589360726788e9 -112.68 165.75987672616318 -1.9671978334556603e9 -112.685 165.74608739106546 -1.9675367774684167e9 -112.69 165.73229393030763 -1.9678757681154077e9 -112.695 165.71849634214468 -1.968214805401094e9 -112.7 165.70469462483024 -1.9685538893299365e9 -112.705 165.6908887766168 -1.9688930199063923e9 -112.71 165.67707879575508 -1.9692321971349247e9 -112.715 165.66326468049488 -1.9695714210199935e9 -112.72 165.6494464290844 -1.9699106915660598e9 -112.725 165.63562403977016 -1.9702500087775843e9 -112.73 165.6217975107977 -1.9705893726590314e9 -112.735 165.6080536547841 -1.9709287832115488e9 -112.74 165.59421884756313 -1.9712682404362507e9 -112.745 165.5803798722921 -1.971607744344261e9 -112.75 165.56653672719182 -1.9719472949400427e9 -112.755 165.55268941048192 -1.9722868922280626e9 -112.76 165.5390120067708 -1.9726265361990516e9 -112.765 165.52515633792865 -1.9729662268649657e9 -112.77 165.51129644565341 -1.9733059642365198e9 -112.775 165.49743232812017 -1.9736457483181849e9 -112.78 165.48356398350296 -1.973985579114433e9 -112.785 165.46969140997402 -1.974325456629737e9 -112.79 165.45581460570412 -1.9746653808685699e9 -112.795 165.44193356886288 -1.975005351835404e9 -112.8 165.4280482976179 -1.975345369534713e9 -112.805 165.41415879013573 -1.975685433970972e9 -112.81 165.40026504458126 -1.9760255451486533e9 -112.815 165.38636705911793 -1.9763657030722313e9 -112.82 165.3724648319078 -1.9767059077461803e9 -112.825 165.35855836111125 -1.9770461591749775e9 -112.83 165.34464764488717 -1.977386457363095e9 -112.835 165.33073268139321 -1.977726802315009e9 -112.84 165.31681346878537 -1.9780671940351963e9 -112.845 165.30289000521816 -1.9784076325281312e9 -112.85 165.28896228884446 -1.9787481177982895e9 -112.855 165.2750303178158 -1.97908864985015e9 -112.86 165.2610940902824 -1.9794292286881874e9 -112.865 165.24715360439262 -1.9797698543168788e9 -112.87 165.23320885829344 -1.9801105267407024e9 -112.875 165.21925985013053 -1.9804512459641347e9 -112.88 165.2053065780476 -1.9807920119916544e9 -112.885 165.19134904018753 -1.981132824827739e9 -112.89 165.17738723469108 -1.9814736844768665e9 -112.895 165.16342115969766 -1.9818145909435163e9 -112.9 165.14945081334534 -1.9821555442321677e9 -112.905 165.13547619377053 -1.9824965443472986e9 -112.91 165.1214972991082 -1.9828375912933884e9 -112.915 165.10751412749164 -1.9831786850749187e9 -112.92 165.09352667705292 -1.9835198256963675e9 -112.925 165.07953494592243 -1.9838610131622152e9 -112.93 165.06553893222866 -1.984202247476945e9 -112.935 165.05153863409927 -1.984543528645034e9 -112.94 165.03753404966002 -1.9848848566709647e9 -112.945 165.02352517703505 -1.9852262315592198e9 -112.95 165.009512014347 -1.9855676533142805e9 -112.955 164.99549455971734 -1.985909121940627e9 -112.96 164.98147281126555 -1.9862506374427428e9 -112.965 164.9674467671099 -1.986592199825111e9 -112.97 164.95341642536678 -1.9869338090922132e9 -112.975 164.9393817841515 -1.9872754652485323e9 -112.98 164.92534284157716 -1.9876171682985532e9 -112.985 164.91129959575602 -1.9879589182467577e9 -112.99 164.8972520447985 -1.9883007150976305e9 -112.995 164.88320018681338 -1.9886425588556561e9 -113. 164.86914401990802 -1.9889844495253177e9 -113.005 164.85508354218823 -1.9893263871111007e9 -113.01 164.8410187517581 -1.9896683716174917e9 -113.015 164.82694964672044 -1.990010403048973e9 -113.02 164.81287622517624 -1.9903524814100313e9 -113.025 164.79879848522498 -1.9906946067051544e9 -113.03 164.7847164249648 -1.9910367789388244e9 -113.035 164.7706300424922 -1.9913789981155303e9 -113.04 164.75653933590172 -1.9917212642397597e9 -113.045 164.742444303287 -1.9920635773159966e9 -113.05 164.72834494273948 -1.9924059373487296e9 -113.055 164.71424125234955 -1.9927483443424473e9 -113.06 164.70013323020558 -1.9930907983016355e9 -113.065 164.68602087439479 -1.993433299230783e9 -113.07 164.6719041830025 -1.993775847134378e9 -113.075 164.6577831541126 -1.9941184420169106e9 -113.08 164.64365778580733 -1.9944610838828666e9 -113.085 164.62952807616747 -1.9948037727367375e9 -113.09 164.61539402327202 -1.9951465085830126e9 -113.095 164.60125562519866 -1.9954892914261804e9 -113.1 164.5871128800232 -1.9958321212707307e9 -113.105 164.57296578582012 -1.9961749981211557e9 -113.11 164.55881434066202 -1.9965179219819438e9 -113.115 164.54465854262028 -1.9968608928575866e9 -113.12 164.53049838976435 -1.9972039107525764e9 -113.125 164.5163338801623 -1.9975469756714025e9 -113.13 164.5021650118804 -1.9978900876185575e9 -113.135 164.48799178298347 -1.9982332465985339e9 -113.14 164.47381419153484 -1.9985764526158218e9 -113.145 164.4596322355959 -1.9989197056749153e9 -113.15 164.44544591322685 -1.999263005780308e9 -113.155 164.43125522248585 -1.999606352936491e9 -113.16 164.41706016142967 -1.9999497471479585e9 -113.165 164.40286072811367 -2.0002931884192042e9 -113.17 164.38865692059122 -2.0006366767547216e9 -113.175 164.3744487369143 -2.0009802121590042e9 -113.18 164.36023617513297 -2.001323794636549e9 -113.185 164.34601923329637 -2.0016674241918464e9 -113.19 164.33179790945127 -2.0020111008293953e9 -113.195 164.31757220164317 -2.0023548245536888e9 -113.2 164.30334210791597 -2.0026985953692234e9 -113.205 164.2891076263117 -2.003042413280494e9 -113.21 164.27486875487088 -2.0033862782919981e9 -113.215 164.26062549163268 -2.0037301904082313e9 -113.22 164.24637783463436 -2.0040741496336894e9 -113.225 164.2328210370806 -2.0044181559500191e9 -113.23 164.21856478487115 -2.0047622093468573e9 -113.235 164.20430411881014 -2.005106309866392e9 -113.24 164.1900390369148 -2.0054504575131202e9 -113.245 164.17576953720024 -2.0057946522915454e9 -113.25 164.16149561768037 -2.0061388942061636e9 -113.255 164.14721727636723 -2.0064831832614756e9 -113.26 164.1329345112711 -2.006827519461983e9 -113.265 164.11864732040078 -2.0071719028121843e9 -113.27 164.1043557017633 -2.0075163333165805e9 -113.275 164.09005965336405 -2.0078608109796736e9 -113.28 164.07575917320673 -2.0082053358059633e9 -113.285 164.06145425929319 -2.008549907799952e9 -113.29 164.04714490962417 -2.008894526966142e9 -113.295 164.03283112219805 -2.0092391933090343e9 -113.3 164.0185128950119 -2.0095839068331316e9 -113.305 164.00419022606116 -2.0099286675429378e9 -113.31 163.9898631133393 -2.010273475442953e9 -113.315 163.9755315548383 -2.010618330537683e9 -113.32 163.96119554854846 -2.0109632328316298e9 -113.325 163.94685509245826 -2.0113081823293e9 -113.33 163.9325101845547 -2.0116531790351932e9 -113.335 163.91816082282284 -2.011998222953816e9 -113.34 163.90380700524616 -2.012343314089675e9 -113.345 163.88944872980656 -2.0126884524472706e9 -113.35 163.87508599448407 -2.0130336380311108e9 -113.355 163.86071879725708 -2.0133788708457022e9 -113.36 163.84634713610222 -2.0137241508955472e9 -113.365 163.83197100899443 -2.014069478185155e9 -113.37 163.81759041390697 -2.0144148527190304e9 -113.375 163.80320534881145 -2.0147602745016794e9 -113.38 163.78881581167775 -2.0151057435376096e9 -113.385 163.77442180047393 -2.015451259831329e9 -113.39 163.7600233131663 -2.015796823387344e9 -113.395 163.74562034771958 -2.0161424342101607e9 -113.4 163.7312129020969 -2.0164880923042912e9 -113.405 163.71680097425923 -2.0168337976742399e9 -113.41 163.70238456216623 -2.0171795503245165e9 -113.415 163.68796366377566 -2.0175253502596319e9 -113.42 163.67353827704358 -2.0178711974840925e9 -113.425 163.65910839992424 -2.0182170920024087e9 -113.43 163.64467403037028 -2.0185630338190906e9 -113.435 163.63023516633257 -2.0189090229386473e9 -113.44 163.61579180576018 -2.0192550593655891e9 -113.445 163.60134394660057 -2.0196011431044273e9 -113.45 163.58689158679908 -2.0199472741596737e9 -113.455 163.57243472429988 -2.020293452535836e9 -113.46 163.557973357045 -2.0206396782374287e9 -113.465 163.54350748297475 -2.0209859512689629e9 -113.47 163.5290371000279 -2.0213322716349494e9 -113.475 163.51456220614125 -2.0216786393399014e9 -113.48 163.50008279924998 -2.0220250543883317e9 -113.485 163.48559887728734 -2.0223715167847505e9 -113.49 163.47120997666926 -2.0227180265230799e9 -113.495 163.45671701078942 -2.0230645836178317e9 -113.5 163.44221949724346 -2.0234111880741148e9 -113.505 163.42771743393456 -2.0237578398964477e9 -113.51 163.41341039927454 -2.024104539078848e9 -113.515 163.39889924056502 -2.024451285624409e9 -113.52 163.38438347278841 -2.0247980795495727e9 -113.525 163.36986309379324 -2.0251449208588653e9 -113.53 163.35533810142618 -2.025491809556807e9 -113.535 163.34080849353205 -2.0258387456479256e9 -113.54 163.32627426795378 -2.026185729136745e9 -113.545 163.31173542253248 -2.0265327600277896e9 -113.55 163.29719195510722 -2.0268798383255858e9 -113.555 163.2826438635155 -2.0272269640346603e9 -113.56 163.26809114559276 -2.0275741371595364e9 -113.565 163.2535337991725 -2.0279213577047417e9 -113.57 163.2389718220865 -2.0282686256748035e9 -113.575 163.2244052121646 -2.0286159410742488e9 -113.58 163.20983396723466 -2.028963303907603e9 -113.585 163.19525808512284 -2.029310714179395e9 -113.59 163.18067756365318 -2.0296581718941534e9 -113.595 163.1660924006481 -2.0300056770564036e9 -113.6 163.15150259392792 -2.0303532296706762e9 -113.605 163.13690814131107 -2.0307008297414994e9 -113.61 163.1223090406143 -2.0310484772734013e9 -113.615 163.1077052896522 -2.0313961722709112e9 -113.62 163.09309688623762 -2.031743914738561e9 -113.625 163.07848382818136 -2.0320917046808767e9 -113.63 163.0638661132925 -2.0324395421023908e9 -113.635 163.04924373937808 -2.0327874270076344e9 -113.64 163.0346167042433 -2.0331353594011345e9 -113.645 163.01998500569127 -2.0334833392874255e9 -113.65 163.00534864152334 -2.033831366671039e9 -113.655 162.99070760953921 -2.0341794415565035e9 -113.66 162.9760619075361 -2.0345275639483523e9 -113.665 162.96141153330956 -2.0348757338511195e9 -113.67 162.94675648465335 -2.0352239512693338e9 -113.675 162.93209675935927 -2.0355722162075307e9 -113.68 162.91743235521682 -2.0359205286702437e9 -113.685 162.90276327001405 -2.0362688886620026e9 -113.69 162.8880895015369 -2.0366172961873436e9 -113.695 162.87341104756922 -2.0369657512508004e9 -113.7 162.85872790589303 -2.0373142538569074e9 -113.705 162.84404007428859 -2.0376628040101979e9 -113.71 162.82934755053384 -2.038011401715207e9 -113.715 162.8146503324051 -2.0383600469764707e9 -113.72 162.79994841767663 -2.0387087397985234e9 -113.725 162.78524180412063 -2.0390574801859007e9 -113.73 162.77053048950737 -2.0394062681431398e9 -113.735 162.75581447160553 -2.0397551036747746e9 -113.74 162.74109374818124 -2.040103986785344e9 -113.745 162.72636831699901 -2.0404529174793835e9 -113.75 162.71163817582132 -2.0408018957614303e9 -113.755 162.6969033224088 -2.0411509216360211e9 -113.76 162.68216375451985 -2.0414999951076958e9 -113.765 162.66741946991118 -2.0418491161809902e9 -113.77 162.65267046633727 -2.042198284860443e9 -113.775 162.63791674155078 -2.0425475011505942e9 -113.78 162.6231582933023 -2.0428967650559802e9 -113.785 162.60839511934066 -2.043246076581142e9 -113.79 162.59362721741223 -2.0435954357306192e9 -113.795 162.57885458526198 -2.04394484250895e9 -113.8 162.56407722063244 -2.0442942969206743e9 -113.805 162.5492951212643 -2.0446437989703355e9 -113.81 162.5345082848963 -2.0449933486624703e9 -113.815 162.51971670926517 -2.0453429460016224e9 -113.82 162.5049203921056 -2.0456925909923315e9 -113.825 162.49011933115017 -2.0460422836391397e9 -113.83 162.47531352412975 -2.0463920239465883e9 -113.835 162.4605029687729 -2.04674181191922e9 -113.84 162.44568766280617 -2.047091647561577e9 -113.845 162.4308676039544 -2.0474415308782015e9 -113.85 162.41604278994018 -2.0477914618736365e9 -113.855 162.4012132184841 -2.0481414405524263e9 -113.86 162.3863788873046 -2.048491466919113e9 -113.865 162.3715397941185 -2.0488415409782417e9 -113.87 162.3566959366403 -2.049191662734356e9 -113.875 162.34184731258244 -2.0495418321919997e9 -113.88 162.32699391965537 -2.0498920493557186e9 -113.885 162.3121357555675 -2.0502423142300575e9 -113.89 162.2972728180254 -2.0505926268195605e9 -113.895 162.28240510473327 -2.050942987128774e9 -113.9 162.26753261339346 -2.0512933951622453e9 -113.905 162.25265534170623 -2.0516438509245188e9 -113.91 162.2377732873699 -2.051994354420141e9 -113.915 162.22288644808052 -2.0523449056536608e9 -113.92 162.20799482153228 -2.0526955046296225e9 -113.925 162.19309840541715 -2.0530461513525739e9 -113.93 162.17819719742536 -2.0533968458270648e9 -113.935 162.16621636786962 -2.0537475879446423e9 -113.94 162.15130641095698 -2.0540983776161904e9 -113.945 162.13639155072477 -2.0544492150528262e9 -113.95 162.12147178475612 -2.0548001002591102e9 -113.955 162.10654711063162 -2.0551510332396016e9 -113.96 162.0916175259299 -2.0555020139988625e9 -113.965 162.07668302822728 -2.0558530425414538e9 -113.97 162.06174361509767 -2.0562041188719368e9 -113.975 162.04679928411326 -2.0565552429948733e9 -113.98 162.03185003284364 -2.0569064149148264e9 -113.985 162.01689585885626 -2.0572576346363566e9 -113.99 162.00193675971659 -2.057608902164028e9 -113.995 161.98697273298748 -2.0579602175024045e9 -114. 161.97200377622997 -2.0583115806560466e9 -114.005 161.95702988700268 -2.0586629916295195e9 -114.01 161.94205106286182 -2.059014450427389e9 -114.015 161.92706730136186 -2.0593659570542161e9 -114.02 161.9120786000545 -2.0597175115145662e9 -114.025 161.89708495648946 -2.0600691138130069e9 -114.03 161.88208636821443 -2.0604207639541e9 -114.035 161.8670828327745 -2.060772461942412e9 -114.04 161.85207434771266 -2.0611242077825098e9 -114.045 161.83706091056973 -2.0614760014789572e9 -114.05 161.82204251888416 -2.061827843036323e9 -114.055 161.8070191701921 -2.0621797324591725e9 -114.06 161.7919908620278 -2.0625316697520723e9 -114.065 161.77695759192278 -2.0628836549195914e9 -114.07 161.76191935740658 -2.0632356879662957e9 -114.075 161.74687615600635 -2.0635877688967543e9 -114.08 161.73182798524724 -2.0639398977155347e9 -114.085 161.7167748426516 -2.064292074427205e9 -114.09 161.70171672574006 -2.064644299036336e9 -114.095 161.68665363203078 -2.0649965715474942e9 -114.1 161.67158555903939 -2.065348891965251e9 -114.105 161.65651250427962 -2.0657012602941751e9 -114.11 161.64143446526282 -2.0660536765388367e9 -114.115 161.62635143949774 -2.0664061407038064e9 -114.12 161.61126342449126 -2.0667586527936559e9 -114.125 161.59617041774771 -2.067111212812954e9 -114.13 161.58107241676927 -2.067463820766272e9 -114.135 161.56596941905562 -2.0678164766581845e9 -114.14 161.5508614221044 -2.0681691804932601e9 -114.145 161.5357484234107 -2.0685219322760725e9 -114.15 161.5206304204674 -2.0688747320111952e9 -114.155 161.50550741076523 -2.0692275797031987e9 -114.16 161.4903793917923 -2.0695804753566556e9 -114.165 161.4752463610345 -2.0699334189761438e9 -114.17 161.4601083159757 -2.0702864105662324e9 -114.175 161.44496525409696 -2.0706394501314974e9 -114.18 161.42981717287728 -2.0709925376765134e9 -114.185 161.41466406979322 -2.071345673205854e9 -114.19 161.3995059423194 -2.0716988567240949e9 -114.195 161.38434278792735 -2.072052088235811e9 -114.2 161.36917460408688 -2.0724053677455792e9 -114.205 161.35400138826532 -2.0727586952579727e9 -114.21 161.33882313792748 -2.0731120707775688e9 -114.215 161.32363985053598 -2.0734654943089457e9 -114.22 161.30845152355113 -2.0738189658566785e9 -114.225 161.29325815443065 -2.0741724854253445e9 -114.23 161.27805974063 -2.0745260530195222e9 -114.235 161.26285627960254 -2.0748796686437867e9 -114.24 161.24776247775358 -2.0752333323004391e9 -114.245 161.23254893134347 -2.0755870439860036e9 -114.25 161.21733029972194 -2.075940803715391e9 -114.255 161.202106580303 -2.0762946114931834e9 -114.26 161.18687777049809 -2.0766484673239646e9 -114.265 161.17187391509393 -2.0770023711901765e9 -114.27 161.15663490833575 -2.0773563231154056e9 -114.275 161.14139074240668 -2.077710323107378e9 -114.28 161.1261414146484 -2.07806437117068e9 -114.285 161.11088692239963 -2.078418467309906e9 -114.29 161.09562726299674 -2.0787726115296457e9 -114.295 161.0803624337737 -2.0791268038344908e9 -114.3 161.06509243206182 -2.0794810442290328e9 -114.305 161.0498172551898 -2.079835332717865e9 -114.31 161.0345369004839 -2.0801896693055787e9 -114.315 161.01925136526805 -2.0805440539967663e9 -114.32 161.00396064686316 -2.0808984867960222e9 -114.325 160.9886647425882 -2.0812529677079394e9 -114.33 160.97336364975928 -2.0816074967371109e9 -114.335 160.9580573656897 -2.0819620738881314e9 -114.34 160.94274588769082 -2.0823166991655967e9 -114.345 160.92742921307098 -2.0826713725740979e9 -114.35 160.9121073391361 -2.0830260941182325e9 -114.355 160.8967802631896 -2.083380863802596e9 -114.36 160.8814479825322 -2.083735681631783e9 -114.365 160.86611049446225 -2.0840905476103895e9 -114.37 160.85076779627528 -2.084445461743013e9 -114.375 160.83541988526449 -2.0848004240342476e9 -114.38 160.82006675872037 -2.0851554344886918e9 -114.385 160.80470841393074 -2.0855104931109447e9 -114.39 160.78934484818123 -2.0858655999055996e9 -114.395 160.77397605875422 -2.0862207548772578e9 -114.4 160.75860204293008 -2.0865759580305164e9 -114.405 160.74322279798653 -2.086931209369974e9 -114.41 160.72783832119825 -2.0872865089002283e9 -114.415 160.7124486098378 -2.08764185662588e9 -114.42 160.69705366117478 -2.087997252551528e9 -114.425 160.68165347247646 -2.0883526966817708e9 -114.43 160.66624804100738 -2.0887081890212111e9 -114.435 160.65083736402954 -2.0890637295744472e9 -114.44 160.6354214388021 -2.0894193183460803e9 -114.445 160.62000026258167 -2.0897749553407116e9 -114.45 160.60457383262238 -2.090130640562943e9 -114.455 160.5891421461758 -2.0904863740173755e9 -114.46 160.57370520049042 -2.0908421557086105e9 -114.465 160.55826299281253 -2.0911979856412525e9 -114.47 160.54281552038555 -2.091553863819902e9 -114.475 160.52736278045052 -2.0919097902491622e9 -114.48 160.51190477024542 -2.0922657649336376e9 -114.485 160.49644148700588 -2.0926217878779309e9 -114.49 160.48097292796476 -2.0929778590866458e9 -114.495 160.4654990903522 -2.0933339785643876e9 -114.5 160.45001997139596 -2.0936901463157601e9 -114.505 160.43453556832063 -2.094046362345368e9 -114.51 160.41904587834864 -2.0944026266578178e9 -114.515 160.40355089869954 -2.0947589392577124e9 -114.52 160.38805062659017 -2.0951153001496594e9 -114.525 160.37254505923445 -2.0954717093382664e9 -114.53 160.3570341938441 -2.095828166828137e9 -114.535 160.34151802762784 -2.09618467262388e9 -114.54 160.32599655779177 -2.0965412267301023e9 -114.545 160.31046978153924 -2.0968978291514103e9 -114.55 160.29493769607097 -2.0972544798924122e9 -114.555 160.27940029858485 -2.0976111789577172e9 -114.56 160.26385758627643 -2.0979679263519318e9 -114.565 160.2483095563379 -2.0983247220796661e9 -114.57 160.2327562059592 -2.0986815661455288e9 -114.575 160.2171975323275 -2.0990384585541303e9 -114.58 160.2016335326271 -2.0993953993100784e9 -114.585 160.18606420403987 -2.0997523884179835e9 -114.59 160.17048954374428 -2.1001094258824587e9 -114.595 160.15490954891703 -2.1004665117081108e9 -114.6 160.13932421673115 -2.1008236458995526e9 -114.605 160.12373354435752 -2.1011808284613967e9 -114.61 160.10813752896394 -2.1015380593982518e9 -114.615 160.09253616771585 -2.1018953387147317e9 -114.62 160.07692945777535 -2.1022526664154496e9 -114.625 160.06131739630231 -2.1026100425050156e9 -114.63 160.04569998045346 -2.1029674669880445e9 -114.635 160.03007720738304 -2.1033249398691492e9 -114.64 160.0144490742425 -2.1036824611529431e9 -114.645 159.99881557818009 -2.10404003084404e9 -114.65 159.98317671634186 -2.1043976489470541e9 -114.655 159.96753248587086 -2.1047553154666e9 -114.66 159.951882883907 -2.1051130304072928e9 -114.665 159.93622790758803 -2.1054707937737489e9 -114.67 159.92056755404826 -2.1058286055705807e9 -114.675 159.90490182041975 -2.106186465802407e9 -114.68 159.8892307038313 -2.106544374473843e9 -114.685 159.8735542014093 -2.1069023315895047e9 -114.69 159.8578723102771 -2.1072603371540089e9 -114.695 159.84218502755516 -2.1076183911719735e9 -114.7 159.82649235036124 -2.1079764936480157e9 -114.705 159.81079427581034 -2.1083346445867534e9 -114.71 159.79509080101454 -2.1086928439928038e9 -114.715 159.779381923083 -2.1090510918707874e9 -114.72 159.76366763912213 -2.1094093882253206e9 -114.725 159.7479479462358 -2.1097677330610237e9 -114.73 159.73222284152425 -2.110126126382517e9 -114.735 159.7164923220856 -2.1104845681944184e9 -114.74 159.7007563850149 -2.1108430585013483e9 -114.745 159.6850150274042 -2.111201597307929e9 -114.75 159.66926824634294 -2.111560184618779e9 -114.755 159.6535160389174 -2.11191882043852e9 -114.76 159.63775840221112 -2.1122775047717748e9 -114.765 159.62199533330494 -2.1126362376231627e9 -114.77 159.6062268292765 -2.1129950189973068e9 -114.775 159.59045288720068 -2.1133538488988311e9 -114.78 159.5746735041496 -2.113712727332356e9 -114.785 159.5588886771924 -2.1140716543025045e9 -114.79 159.54309840339522 -2.1144306298139026e9 -114.795 159.52730267982145 -2.1147896538711705e9 -114.8 159.51150150353152 -2.1151487264789338e9 -114.805 159.4956948715829 -2.1155078476418183e9 -114.81 159.47988278103017 -2.115867017364446e9 -114.815 159.46406522892514 -2.1162262356514432e9 -114.82 159.44824221231647 -2.116585502507435e9 -114.825 159.4324137282499 -2.116944817937048e9 -114.83 159.41657977376852 -2.1173041819449062e9 -114.835 159.40074034591217 -2.1176635945356379e9 -114.84 159.38489544171784 -2.1180230557138689e9 -114.845 159.3690450582197 -2.1183825654842246e9 -114.85 159.35318919244892 -2.118742123851334e9 -114.855 159.3373278414335 -2.1191017308198261e9 -114.86 159.32146100219884 -2.1194613863943257e9 -114.865 159.3055886717672 -2.119821090579462e9 -114.87 159.28971084715766 -2.1201808433798654e9 -114.875 159.2738275253867 -2.1205406448001626e9 -114.88 159.25793870346766 -2.1209004948449838e9 -114.885 159.2420443784109 -2.1212603935189595e9 -114.89 159.22614454722373 -2.1216203408267174e9 -114.895 159.2102392069107 -2.1219803367728884e9 -114.9 159.19432835447301 -2.122340381362106e9 -114.905 159.17841198690934 -2.1227004745989966e9 -114.91 159.1624901012149 -2.123060616488193e9 -114.915 159.1465626943819 -2.12342080703433e9 -114.92 159.13062976340024 -2.1237810462420344e9 -114.925 159.1146913052559 -2.124141334115941e9 -114.93 159.0987473169323 -2.124501670660683e9 -114.935 159.08279779540993 -2.1248620558808913e9 -114.94 159.06684273766598 -2.1252224897812004e9 -114.945 159.05088214067464 -2.1255829723662434e9 -114.95 159.03491600140714 -2.1259435036406555e9 -114.955 159.01894431683192 -2.1263040836090689e9 -114.96 159.00296708391394 -2.1266647122761183e9 -114.965 158.98698429961533 -2.1270253896464405e9 -114.97 158.97099596089504 -2.1273861157246685e9 -114.975 158.95500206470928 -2.127746890515439e9 -114.98 158.9390026080108 -2.128107714023388e9 -114.985 158.92299758774945 -2.12846858625315e9 -114.99 158.90698700087196 -2.1288295072093635e9 -114.995 158.89110382827937 -2.1291904768887784e9 -115. 158.87508210740907 -2.1295514952975175e9 -115.005 158.859054775505 -2.1299125624466195e9 -115.01 158.84302182946453 -2.1302736783407269e9 -115.015 158.82724992413807 -2.130634842972195e9 -115.02 158.82971030501935 -2.1309960555526664e9 -115.025 158.8366147438256 -2.1313573145103254e9 -115.03 158.84351918263272 -2.1317186198036485e9 -115.035 158.85042362143906 -2.1320799714366243e9 -115.04 158.8391049590425 -2.132441370178689e9 -115.045 158.8230639617796 -2.1328028176434715e9 -115.05 158.80701708883404 -2.1331643138869257e9 -115.055 158.79096433681198 -2.1335258589137247e9 -115.06 158.7749057023161 -2.1338874527285361e9 -115.065 158.75884118194546 -2.1342490953360326e9 -115.07 158.74277077229542 -2.1346107867408862e9 -115.075 158.726694469958 -2.1349725269477687e9 -115.08 158.71061227152154 -2.1353343159613523e9 -115.085 158.69452417357093 -2.1356961537863095e9 -115.09 158.67843017268697 -2.1360580404273152e9 -115.095 158.66233026544774 -2.136419975889039e9 -115.1 158.6462244484268 -2.1367819601761575e9 -115.105 158.63011271819457 -2.137143993293346e9 -115.11 158.61399507131802 -2.1375060752452755e9 -115.115 158.59787150435997 -2.1378682060366232e9 -115.12 158.58174201388024 -2.1382303856720645e9 -115.125 158.56560659643455 -2.1385926141562736e9 -115.13 158.54946524857513 -2.1389548914939275e9 -115.135 158.53331796685052 -2.1393172176897027e9 -115.14 158.5171647478059 -2.1396795927482746e9 -115.145 158.5010055879823 -2.1400420166743207e9 -115.15 158.48484048391745 -2.14040448947252e9 -115.155 158.46866943214545 -2.1407670111475482e9 -115.16 158.45249242919655 -2.1411295817040842e9 -115.165 158.43630947159733 -2.1414922011468067e9 -115.17 158.42012055587082 -2.141854869480394e9 -115.175 158.40392567853613 -2.1422175867095258e9 -115.18 158.387724836109 -2.1425803528388815e9 -115.185 158.3715180251012 -2.1429431678731406e9 -115.19 158.3553052420211 -2.1433060318169832e9 -115.195 158.33908648337285 -2.1436689446750906e9 -115.2 158.32286174565738 -2.1440319064521449e9 -115.205 158.3066310253717 -2.1443949171528249e9 -115.21 158.29039431900924 -2.1447579767818131e9 -115.215 158.27415162305917 -2.1451210853437939e9 -115.22 158.2579029340077 -2.1454842428434465e9 -115.225 158.2416482483367 -2.1458474492854552e9 -115.23 158.22538756252462 -2.1462107046745038e9 -115.235 158.20912087304598 -2.1465740090152748e9 -115.24 158.19284817637154 -2.1469373623124523e9 -115.245 158.17656946896838 -2.147300764570721e9 -115.25 158.1602847472998 -2.1476642157947645e9 -115.255 158.1439940078252 -2.148027715989269e9 -115.26 158.12769724700036 -2.1483912651589193e9 -115.265 158.11139446127723 -2.1487548633084e9 -115.27 158.09508564710367 -2.1491185104424e9 -115.275 158.0787708009241 -2.1494822065656037e9 -115.28 158.0624499191791 -2.1498459516826973e9 -115.285 158.04612299830544 -2.1502097457983685e9 -115.29 158.02979003473567 -2.150573588917307e9 -115.295 158.013451024899 -2.150937481044198e9 -115.3 157.99710596522047 -2.15130142218373e9 -115.305 157.98075485212155 -2.151665412340593e9 -115.31 157.96439768201986 -2.1520294515194745e9 -115.315 157.94803445132885 -2.1523935397250643e9 -115.32 157.93166515645817 -2.152757676962053e9 -115.325 157.91528979381403 -2.1531218632351303e9 -115.33 157.89890835979838 -2.153486098548986e9 -115.335 157.88252085080927 -2.1538503829083114e9 -115.34 157.86612726324108 -2.154214716317798e9 -115.345 157.84972759348423 -2.1545790987821364e9 -115.35 157.8333218379252 -2.1549435303060193e9 -115.355 157.81690999294653 -2.1553080108941383e9 -115.36 157.800492054927 -2.1556725405511866e9 -115.365 157.78406802024134 -2.1560371192818565e9 -115.37 157.76763788526014 -2.156401747090843e9 -115.375 157.75120164635072 -2.156766423982838e9 -115.38 157.73475929987583 -2.1571311499625363e9 -115.385 157.7183108421946 -2.1574959250346336e9 -115.39 157.70185626966207 -2.1578607492038217e9 -115.395 157.6853955786294 -2.158225622474798e9 -115.4 157.66892876544364 -2.1585905448522587e9 -115.405 157.6524558264484 -2.158955516340898e9 -115.41 157.63597675798246 -2.1593205369454126e9 -115.415 157.61949155638135 -2.1596856066705008e9 -115.42 157.60300021797622 -2.160050725520858e9 -115.425 157.58650273909433 -2.1604158935011806e9 -115.43 157.56999911605922 -2.1607811106161695e9 -115.435 157.55348934518994 -2.16114637687052e9 -115.44 157.53697342280185 -2.1615116922689314e9 -115.445 157.52045134520614 -2.161877056816103e9 -115.45 157.50392310870998 -2.162242470516736e9 -115.455 157.48738870961677 -2.1626079333755264e9 -115.46 157.47084814422547 -2.1629734453971753e9 -115.465 157.4543014088313 -2.163339006586385e9 -115.47 157.43774849972536 -2.1637046169478536e9 -115.475 157.42118941319455 -2.1640702764862833e9 -115.48 157.40462414552186 -2.164435985206377e9 -115.485 157.38805269298626 -2.164801743112834e9 -115.49 157.37147505186232 -2.1651675502103577e9 -115.495 157.35489121842102 -2.1655334065036516e9 -115.5 157.33830118892874 -2.165899311997417e9 -115.505 157.32170495964806 -2.1662652666963577e9 -115.51 157.3051025268376 -2.1666312706051784e9 -115.515 157.2884938867514 -2.1669973237285824e9 -115.52 157.27187903563984 -2.167363426071274e9 -115.525 157.2552579697489 -2.167729577637959e9 -115.53 157.23863068532066 -2.16809577843334e9 -115.535 157.2219971785926 -2.168462028462126e9 -115.54 157.2053574457986 -2.168828327729021e9 -115.545 157.18871148316825 -2.1691946762387304e9 -115.55 157.17205928692678 -2.169561073995963e9 -115.555 157.15540085329525 -2.1699275210054255e9 -115.56 157.13873617849086 -2.1702940172718234e9 -115.565 157.12206525872654 -2.170660562799866e9 -115.57 157.10538809021057 -2.171027157594261e9 -115.575 157.08870466914757 -2.1713938016597195e9 -115.58 157.07201499173803 -2.171760495000946e9 -115.585 157.05531905417777 -2.1721272376226516e9 -115.59 157.0386168526585 -2.1724940295295477e9 -115.595 157.02190838336813 -2.1728608707263417e9 -115.6 157.00519364248984 -2.173227761217746e9 -115.605 156.98847262620285 -2.173594701008471e9 -115.61 156.97174533068215 -2.173961690103226e9 -115.615 156.95501175209827 -2.174328728506725e9 -115.62 156.9382718866176 -2.174695816223679e9 -115.625 156.9215257304025 -2.1750629532587996e9 -115.63 156.90477327961068 -2.1754301396167994e9 -115.635 156.88801453039568 -2.1757973753023934e9 -115.64 156.87124947890703 -2.1761646603202925e9 -115.645 156.85447812128953 -2.176531994675212e9 -115.65 156.83770045368396 -2.176899378371866e9 -115.655 156.82091647222677 -2.1772668114149694e9 -115.66 156.80412617305024 -2.1776342938092346e9 -115.665 156.787329552282 -2.17800182555938e9 -115.67 156.77052660604537 -2.1783694066701193e9 -115.675 156.75371733045972 -2.178737037146169e9 -115.68 156.73690172163975 -2.179104716992248e9 -115.685 156.72007977569584 -2.179472446213069e9 -115.69 156.70325148873428 -2.17984022481335e9 -115.695 156.68641685685657 -2.1802080527978106e9 -115.7 156.66957587616008 -2.1805759301711683e9 -115.705 156.65272854273772 -2.1809438569381404e9 -115.71 156.6358748526784 -2.181311833103445e9 -115.715 156.61901480206603 -2.181679858671804e9 -115.72 156.6021483869805 -2.182047933647933e9 -115.725 156.5852756034971 -2.182416058036555e9 -115.73 156.56839644768698 -2.182784231842389e9 -115.735 156.55151091561652 -2.183152455070155e9 -115.74 156.53461900334798 -2.183520727724574e9 -115.745 156.51772070693883 -2.1838890498103704e9 -115.75 156.5008160224427 -2.1842574213322606e9 -115.755 156.48390494590797 -2.1846258422949696e9 -115.76 156.4669874733791 -2.184994312703222e9 -115.765 156.4502188535396 -2.1853628325577927e9 -115.77 156.43328860376238 -2.185731401855014e9 -115.775 156.41635190469412 -2.186100020611947e9 -115.78 156.3994087523117 -2.186468688833317e9 -115.785 156.38277048101494 -2.1868374065137415e9 -115.79 156.36581445844763 -2.1872061736455503e9 -115.795 156.34885188721634 -2.1875749902559834e9 -115.8 156.3318827631778 -2.1879438563497787e9 -115.805 156.31490708218374 -2.188312771931678e9 -115.81 156.29792484008144 -2.188681737006418e9 -115.815 156.28093603271327 -2.18905075157874e9 -115.82 156.26394065591677 -2.1894198156533833e9 -115.825 156.24693870552468 -2.18978892923509e9 -115.83 156.22993017736502 -2.190158092328598e9 -115.835 156.21291506726092 -2.1905273049386525e9 -115.84 156.19589337103076 -2.190896567069993e9 -115.845 156.178865084488 -2.1912658787273617e9 -115.85 156.1618302034414 -2.1916352399155016e9 -115.855 156.1447887236946 -2.1920046506391563e9 -115.86 156.12774064104676 -2.1923741109030676e9 -115.865 156.1106859512919 -2.192743620711979e9 -115.87 156.09362465021917 -2.193113180070637e9 -115.875 156.07655673361307 -2.1934827889837847e9 -115.88 156.05948219725295 -2.193852447456166e9 -115.885 156.0424010369135 -2.1942221554925284e9 -115.89 156.02531324836423 -2.1945919130976157e9 -115.895 156.00821882736983 -2.194961720276175e9 -115.9 155.9911177696903 -2.1953315770329533e9 -115.905 155.9740100710805 -2.195701483372696e9 -115.91 155.9568957272902 -2.1960714393001513e9 -115.915 155.93977473406463 -2.1964414448200674e9 -115.92 155.9226470871437 -2.196811499937191e9 -115.925 155.90551278226255 -2.197181604656271e9 -115.93 155.8894748366051 -2.1975517589170613e9 -115.935 155.87232759096554 -2.1979219627639256e9 -115.94 155.8551736509602 -2.1982922162269583e9 -115.945 155.83801301227152 -2.198662519310913e9 -115.95 155.8208456705769 -2.199032872020542e9 -115.955 155.80367162154826 -2.1994032743605967e9 -115.96 155.78649086085315 -2.1997737263358316e9 -115.965 155.7693033841533 -2.2001442279510007e9 -115.97 155.7521091871059 -2.2005147792108555e9 -115.975 155.73490826536252 -2.2008853801201534e9 -115.98 155.7177006145702 -2.201256030683648e9 -115.985 155.7004862303703 -2.2016267309060936e9 -115.99 155.6832651083994 -2.2019974807922473e9 -115.995 155.66603724428867 -2.2023682803468647e9 -116. 155.65310111751555 -2.202739129244088e9 -116.005 155.63586120948358 -2.203110027709009e9 -116.01 155.61861439082503 -2.2034809758565216e9 -116.015 155.6013606569504 -2.2038519736913967e9 -116.02 155.58410000326484 -2.20422302121841e9 -116.025 155.56683242516775 -2.204594118442337e9 -116.03 155.54955791805332 -2.2049652653679504e9 -116.035 155.53227647730978 -2.2053364620000257e9 -116.04 155.51498809832023 -2.205707708343341e9 -116.045 155.49769277646192 -2.20607900440267e9 -116.05 155.48039050710653 -2.20645035018279e9 -116.055 155.46308128562032 -2.2068217456884794e9 -116.06 155.44576510736388 -2.207193190924513e9 -116.065 155.428441967692 -2.2075646858956695e9 -116.07 155.41111186195428 -2.2079362306067286e9 -116.075 155.39377478549412 -2.2083078250624695e9 -116.08 155.37643073364987 -2.2086794692676687e9 -116.085 155.3590797017538 -2.2090511632271066e9 -116.09 155.34172168513274 -2.2094229069455643e9 -116.095 155.32435667910786 -2.2097947004278216e9 -116.1 155.30698467899455 -2.210166543678658e9 -116.105 155.28960568010234 -2.2105384367028575e9 -116.11 155.27221967773548 -2.2109103795051994e9 -116.115 155.25482666719233 -2.2112823720904655e9 -116.12 155.23742664376533 -2.211654414463441e9 -116.125 155.22001960274133 -2.212026506628906e9 -116.13 155.20260553940153 -2.212398648591645e9 -116.135 155.18518444902128 -2.212770840356443e9 -116.14 155.1677563268704 -2.2131430819280815e9 -116.145 155.15032116821243 -2.213515373311347e9 -116.15 155.13287896830545 -2.213887714511025e9 -116.155 155.1154297224018 -2.214260105531899e9 -116.16 155.09797342574808 -2.214632546378757e9 -116.165 155.08051007358458 -2.2150050370563846e9 -116.17 155.06303966114643 -2.215377577569567e9 -116.175 155.0455621836625 -2.215750167923094e9 -116.18 155.02807763635585 -2.2161228081217523e9 -116.185 155.0105860144437 -2.216495498170328e9 -116.19 154.99308731313758 -2.2168682380736117e9 -116.195 154.9755815276429 -2.217241027836392e9 -116.2 154.95806865315933 -2.217613867463459e9 -116.205 154.9405486848805 -2.217986756959601e9 -116.21 154.92302161799427 -2.218359696329608e9 -116.215 154.90548744768248 -2.2187326855782723e9 -116.22 154.88794616912122 -2.2191057247103834e9 -116.225 154.87039777748032 -2.219478813730733e9 -116.23 154.85284226792385 -2.2198519526441145e9 -116.235 154.83527963560977 -2.2202251414553185e9 -116.24 154.81770987569044 -2.220598380169137e9 -116.245 154.8001329833117 -2.2209716687903666e9 -116.25 154.78254895361377 -2.2213450073237977e9 -116.255 154.7649577817307 -2.221718395774226e9 -116.26 154.7473594627904 -2.222091834146446e9 -116.265 154.7297539919151 -2.2224653224452515e9 -116.27 154.71214136422066 -2.222838860675438e9 -116.275 154.69452157481695 -2.223212448841803e9 -116.28 154.67689461880795 -2.2235860869491405e9 -116.285 154.65926049129115 -2.223959775002249e9 -116.29 154.64161918735846 -2.224333513005925e9 -116.295 154.62397070209528 -2.224707300964966e9 -116.3 154.60631503058113 -2.2250811388841677e9 -116.305 154.5886521678893 -2.225455026768333e9 -116.31 154.57098210908697 -2.2258289646222563e9 -116.315 154.55330484923516 -2.22620295245074e9 -116.32 154.53562038338865 -2.2265769902585816e9 -116.325 154.51792870659622 -2.2269510780505834e9 -116.33 154.50022981390026 -2.2273252158315444e9 -116.335 154.48252370033714 -2.227699403606266e9 -116.34 154.46481036093692 -2.22807364137955e9 -116.345 154.4470897907235 -2.2284479291561975e9 -116.35 154.4293619847145 -2.2288222669410114e9 -116.355 154.41162693792123 -2.229196654738795e9 -116.36 154.39388464534895 -2.22957109255435e9 -116.365 154.3761351019964 -2.22994558039248e9 -116.37 154.3583783028562 -2.2303201182579913e9 -116.375 154.34061424291457 -2.230694706155686e9 -116.38 154.32284291715166 -2.23106934409037e9 -116.385 154.30506432054088 -2.2314440320668488e9 -116.39 154.2872784480499 -2.2318187700899286e9 -116.395 154.26948529463945 -2.232193558164414e9 -116.4 154.25168485526416 -2.2325683962951136e9 -116.405 154.23387712487244 -2.2329432844868336e9 -116.41 154.2160620984061 -2.233318222744381e9 -116.415 154.19823977080068 -2.233693211072565e9 -116.42 154.18041013698524 -2.2340682494761934e9 -116.425 154.16257319188256 -2.234443337960075e9 -116.43 154.1447289304088 -2.2348184765290203e9 -116.435 154.1268773474737 -2.235193665187837e9 -116.44 154.1090184379809 -2.2355689039413357e9 -116.445 154.09115219682704 -2.2359441927943287e9 -116.45 154.07327861890266 -2.236319531751627e9 -116.455 154.05539769909174 -2.23669492081804e9 -116.46 154.03750943227158 -2.2370703599983807e9 -116.465 154.0196138133131 -2.237445849297463e9 -116.47 154.0017108370809 -2.2378213887200975e9 -116.475 153.98380049843263 -2.2381969782710986e9 -116.48 153.96588279221967 -2.2385726179552813e9 -116.485 153.94795771328666 -2.2389483077774568e9 -116.49 153.93002525647196 -2.2393240477424417e9 -116.495 153.9120854166068 -2.239699837855052e9 -116.5 153.89413818851645 -2.2400756781201005e9 -116.505 153.87618356701915 -2.2404515685424047e9 -116.51 153.8582215469266 -2.2408275091267815e9 -116.515 153.84043472548547 -2.2412034998699102e9 -116.52 153.82245791965332 -2.241579540774215e9 -116.525 153.80447365024892 -2.2419556318550453e9 -116.53 153.78648191199025 -2.242331773117221e9 -116.535 153.7688489176412 -2.2427079645391564e9 -116.54 153.75084225424675 -2.243084206141088e9 -116.545 153.73282800678385 -2.243460497938841e9 -116.55 153.71480616980483 -2.2438368399372516e9 -116.555 153.6967767378549 -2.2442132321411543e9 -116.56 153.67873970547228 -2.2445896745553856e9 -116.565 153.66069506718782 -2.2449661671847816e9 -116.57 153.64264281752537 -2.2453427100341806e9 -116.575 153.6245829510015 -2.245719303108421e9 -116.58 153.60651546212574 -2.2460959464123373e9 -116.585 153.58844034540047 -2.246472639950771e9 -116.59 153.57035759532047 -2.246849383728561e9 -116.595 153.55226720637387 -2.247226177750544e9 -116.6 153.534169173041 -2.2476030220215626e9 -116.605 153.51606348979544 -2.247979916546457e9 -116.61 153.49795015110314 -2.248356861330065e9 -116.615 153.47982915142273 -2.248733856377231e9 -116.62 153.46170048520582 -2.249110901692796e9 -116.625 153.44356414689682 -2.2494879972816014e9 -116.63 153.42542013093217 -2.24986514314849e9 -116.635 153.4072684317417 -2.2502423392983065e9 -116.64 153.38910904374748 -2.250619585735892e9 -116.645 153.37094196136397 -2.2509968824660916e9 -116.65 153.3527671789991 -2.2513742294937515e9 -116.655 153.33458469105253 -2.251751626823714e9 -116.66 153.3163944919168 -2.2521290744608254e9 -116.665 153.2981965759772 -2.2525065724099336e9 -116.67 153.27999093761133 -2.252884120675882e9 -116.675 153.2617775711895 -2.2532617192635193e9 -116.68 153.24355647107436 -2.253639368177694e9 -116.685 153.22532763162116 -2.25401706742325e9 -116.69 153.20709104717784 -2.2543948170050387e9 -116.695 153.18884671208457 -2.2547726169279084e9 -116.7 153.17059462067374 -2.2551504671967096e9 -116.705 153.15233476727093 -2.255528367816289e9 -116.71 153.13406714619344 -2.2559063187914977e9 -116.715 153.11579175175117 -2.2562843201271887e9 -116.72 153.09750857824673 -2.256662371828211e9 -116.725 153.0792176199749 -2.2570404738994155e9 -116.73 153.06091887122273 -2.2574186263456564e9 -116.735 153.04261232626965 -2.257796829171785e9 -116.74 153.02429797938754 -2.2581750823826547e9 -116.745 153.0059758248405 -2.25855338598312e9 -116.75 152.98764585688502 -2.258931739978032e9 -116.755 152.96930806976988 -2.2593101443722477e9 -116.76 152.950962457736 -2.2596885991706223e9 -116.765 152.93260901501682 -2.260067104378009e9 -116.77 152.91424773583768 -2.2604456599992647e9 -116.775 152.89587861441638 -2.260824266039248e9 -116.78 152.87750164496288 -2.261202922502812e9 -116.785 152.85911682167932 -2.261581629394816e9 -116.79 152.8407241387599 -2.2619603867201185e9 -116.795 152.82232359039136 -2.262339194483577e9 -116.8 152.80391517075213 -2.262718052690048e9 -116.805 152.785498874013 -2.263096961344396e9 -116.81 152.76707469433683 -2.263475920451475e9 -116.815 152.74864262587855 -2.2638549300161495e9 -116.82 152.73020266278527 -2.2642339900432777e9 -116.825 152.71175479919606 -2.264613100537722e9 -116.83 152.69329902924198 -2.264992261504344e9 -116.835 152.67483534704633 -2.2653714729480042e9 -116.84 152.6563637467242 -2.2657507348735676e9 -116.845 152.63788422238278 -2.266130047285896e9 -116.85 152.61939676812122 -2.266509410189853e9 -116.855 152.6009013780307 -2.2668888235903044e9 -116.86 152.5823980461943 -2.2672682874921107e9 -116.865 152.5638867666869 -2.267647801900141e9 -116.87 152.54536753357547 -2.268027366819259e9 -116.875 152.52684034091874 -2.2684069822543306e9 -116.88 152.50830518276743 -2.2687866482102222e9 -116.885 152.4897620531641 -2.269166364691803e9 -116.89 152.47121094614315 -2.269546131703937e9 -116.895 152.45265185573066 -2.2699259492514944e9 -116.9 152.43408477594454 -2.2703058173393435e9 -116.905 152.4155097007948 -2.270685735972353e9 -116.91 152.39692662428297 -2.2710657051553907e9 -116.915 152.37833554040222 -2.271445724893329e9 -116.92 152.35973644313776 -2.2718257951910367e9 -116.925 152.34112932646644 -2.272205916053385e9 -116.93 152.32251418435638 -2.2725860874852457e9 -116.935 152.303891010768 -2.2729663094914894e9 -116.94 152.2852597996531 -2.27334658207699e9 -116.945 152.26662054495506 -2.2737269052466197e9 -116.95 152.24797324060913 -2.274107279005252e9 -116.955 152.22931788054188 -2.2744877033577604e9 -116.96 152.21065445867168 -2.2748681783090186e9 -116.965 152.19198296890843 -2.275248703863903e9 -116.97 152.1733034051536 -2.2756292800272875e9 -116.975 152.15461576130016 -2.2760099068040476e9 -116.98 152.13592003123247 -2.2763905841990623e9 -116.985 152.1172162088267 -2.2767713122172046e9 -116.99 152.09850428795028 -2.2771520908633533e9 -116.995 152.07978426246214 -2.2775329201423883e9 -117. 152.06105612621283 -2.277913800059184e9 -117.005 152.04231987304397 -2.2782947306186213e9 -117.01 152.02357549678896 -2.2786757118255796e9 -117.015 152.0048229912723 -2.2790567436849375e9 -117.02 151.9860623503102 -2.279437826201576e9 -117.025 151.96729356770973 -2.279818959380377e9 -117.03 151.94851663726993 -2.280200143226218e9 -117.035 151.92973155278065 -2.280581377743984e9 -117.04 151.910938308023 -2.2809626629385586e9 -117.045 151.89213689676996 -2.2813439988148193e9 -117.05 151.87332731278514 -2.2817253853776526e9 -117.055 151.85450954982366 -2.2821068226319427e9 -117.06 151.83568360163187 -2.2824883105825725e9 -117.065 151.8168494619472 -2.282869849234427e9 -117.07 151.79800712449858 -2.283251438592391e9 -117.075 151.7791565830056 -2.2836330786613517e9 -117.08 151.7602978311793 -2.2840147694461927e9 -117.085 151.74143086272184 -2.284396510951803e9 -117.09 151.72255567132655 -2.2847783031830697e9 -117.095 151.7036722506776 -2.285160146144878e9 -117.1 151.68478059445044 -2.285542039842119e9 -117.105 151.66588069631143 -2.285923984279681e9 -117.11 151.64697254991816 -2.2863059794624515e9 -117.115 151.62805614891894 -2.2866880253953214e9 -117.12 151.60913148695317 -2.2870701220831814e9 -117.125 151.59019855765152 -2.28745226953092e9 -117.13 151.57125735463504 -2.2878344677434306e9 -117.135 151.55230787151612 -2.288216716725605e9 -117.14 151.53335010189787 -2.288599016482333e9 -117.145 151.51438403937448 -2.28898136701851e9 -117.15 151.49540967753066 -2.2893637683390293e9 -117.155 151.4764270099424 -2.289746220448782e9 -117.16 151.4574360301761 -2.2901287233526635e9 -117.165 151.4384367317893 -2.290511277055571e9 -117.17 151.41942910833018 -2.290893881562395e9 -117.175 151.4004131533375 -2.2912765368780355e9 -117.18 151.38138886034102 -2.291659243007387e9 -117.185 151.36235622286108 -2.2920419999553466e9 -117.19 151.34331523440892 -2.2924248077268114e9 -117.195 151.3242658884861 -2.2928076663266788e9 -117.2 151.3052081785852 -2.293190575759848e9 -117.205 151.28614209818903 -2.2935735360312176e9 -117.21 151.2670676407716 -2.293956547145686e9 -117.215 151.24798479979682 -2.2943396091081557e9 -117.22 151.22889356871983 -2.294722721923523e9 -117.225 151.20979394098566 -2.2951058855966916e9 -117.23 151.19068591003045 -2.2954891001325626e9 -117.235 151.17156946928057 -2.2958723655360374e9 -117.24 151.1524446121529 -2.2962556818120174e9 -117.245 151.13331133205457 -2.2966390489654083e9 -117.25 151.11416962238386 -2.297022467001111e9 -117.255 151.09523585662083 -2.2974059359220657e9 -117.26 151.0760773257478 -2.2977894557155695e9 -117.265 151.05691028580887 -2.2981730264060955e9 -117.27 151.03773473007288 -2.298556647998557e9 -117.275 151.01898466159128 -2.2989403204732146e9 -117.28 150.99979211393634 -2.299324043841115e9 -117.285 150.9805909102141 -2.299707818125688e9 -117.29 150.96138104346954 -2.300091643331861e9 -117.295 150.94216250673773 -2.3004755194645576e9 -117.3 150.92293529304354 -2.3008594465287056e9 -117.305 150.90369939540085 -2.301243424529232e9 -117.31 150.88445480681392 -2.3016274534710636e9 -117.315 150.8652015202761 -2.302011533359129e9 -117.32 150.84593952877054 -2.302395664198357e9 -117.325 150.82666882526982 -2.302779845993678e9 -117.33 150.80738940273608 -2.3031640787500196e9 -117.335 150.78810125412116 -2.3035483624723125e9 -117.34 150.76880437236596 -2.3039326971654897e9 -117.345 150.74949875040133 -2.304317082834481e9 -117.35 150.7301843811473 -2.3047015194842167e9 -117.355 150.7108612575131 -2.3050860071196337e9 -117.36 150.69152937239775 -2.3054705457456603e9 -117.365 150.6721887186894 -2.305855135367233e9 -117.37 150.65283928926544 -2.3062397759892855e9 -117.375 150.63348107699272 -2.306624467616751e9 -117.38 150.61411407472747 -2.307009210254566e9 -117.385 150.594738275315 -2.3073940039076676e9 -117.39 150.57535367158948 -2.307778848580989e9 -117.395 150.55596025637536 -2.3081637442794685e9 -117.4 150.53655802248505 -2.3085486910080457e9 -117.405 150.51714696272074 -2.3089336887716546e9 -117.41 150.49772706987386 -2.309318737575236e9 -117.415 150.4782983367244 -2.309703837423729e9 -117.42 150.45886075604207 -2.310088988322073e9 -117.425 150.43941432058506 -2.3104741902752075e9 -117.43 150.41995902310077 -2.310859443288074e9 -117.435 150.400494856326 -2.311244747365613e9 -117.44 150.38102181298572 -2.3116301025127664e9 -117.445 150.36153988579446 -2.312015508734477e9 -117.45 150.3420490674554 -2.312400966035689e9 -117.455 150.32254935066086 -2.312786474421343e9 -117.46 150.3030407280915 -2.3131720338963847e9 -117.465 150.28352319241736 -2.31355764446576e9 -117.47 150.26399673629726 -2.3139433061344113e9 -117.475 150.2444613523781 -2.3143290189072857e9 -117.48 150.22491703329638 -2.314714782789329e9 -117.485 150.2053637716769 -2.315100597785489e9 -117.49 150.1858015601332 -2.3154864639007115e9 -117.495 150.16623039126742 -2.3158723811399465e9 -117.5 150.14665025767067 -2.31625834950814e9 -117.505 150.12706115192208 -2.3166443690102425e9 -117.51 150.10746306658993 -2.317030439651204e9 -117.515 150.08785599423086 -2.317416561435973e9 -117.52 150.0682399273898 -2.317802734369502e9 -117.525 150.04861485860056 -2.318188958456742e9 -117.53 150.02898078038515 -2.3185752337026443e9 -117.535 150.00933768525414 -2.3189615601121597e9 -117.54 149.98968556570657 -2.3193479376902447e9 -117.545 149.97002441422947 -2.319734366441851e9 -117.55 149.9503542232989 -2.320120846371931e9 -117.555 149.9306749853786 -2.320507377485443e9 -117.56 149.91098669292097 -2.320893959787339e9 -117.565 149.89128933836648 -2.321280593282576e9 -117.57 149.87158291414414 -2.3216672779761105e9 -117.575 149.85186741267088 -2.3220540138728995e9 -117.58 149.83214282635183 -2.3224408009779e9 -117.585 149.81240914758033 -2.3228276392960696e9 -117.59 149.79266636873788 -2.3232145288323693e9 -117.595 149.77291448219398 -2.323601469591756e9 -117.6 149.7531534803064 -2.323988461579189e9 -117.605 149.73338335542047 -2.324375504799631e9 -117.61 149.71360409987017 -2.324762599258041e9 -117.615 149.69381570597687 -2.3251497449593806e9 -117.62 149.6740181660501 -2.325536941908613e9 -117.625 149.6542114723874 -2.3259241901106997e9 -117.63 149.63439561727404 -2.326311489570604e9 -117.635 149.61457059298317 -2.326698840293291e9 -117.64 149.5947363917759 -2.327086242283722e9 -117.645 149.57489300590075 -2.327473695546865e9 -117.65 149.55504042759446 -2.3278612000876846e9 -117.655 149.53517864908108 -2.328248755911146e9 -117.66 149.5153076625727 -2.328636363022216e9 -117.665 149.49542746026856 -2.3290240214258633e9 -117.67 149.47553803435645 -2.3294117311270533e9 -117.675 149.45563937701064 -2.329799492130756e9 -117.68 149.43573148039374 -2.3301873044419403e9 -117.685 149.41581433665556 -2.3305751680655746e9 -117.69 149.3958879379335 -2.3309630830066295e9 -117.695 149.37595227635248 -2.3313510492700768e9 -117.7 149.35600734402456 -2.3317390668608866e9 -117.705 149.33605313304966 -2.332127135784031e9 -117.71 149.31608963551486 -2.3325152560444813e9 -117.715 149.29611684349425 -2.332903427647213e9 -117.72 149.27613474904985 -2.3332916505971975e9 -117.725 149.25614334423048 -2.3336799248994083e9 -117.73 149.23614262107213 -2.334068250558824e9 -117.735 149.2161325715985 -2.3344566275804157e9 -117.74 149.19611318782015 -2.334845055969161e9 -117.745 149.17608446173443 -2.3352335357300377e9 -117.75 149.1560463853265 -2.3356220668680205e9 -117.755 149.13599895056808 -2.336010649388088e9 -117.76 149.11594214941798 -2.3363992832952194e9 -117.765 149.0958759738223 -2.336787968594393e9 -117.77 149.07580041571373 -2.3371767052905865e9 -117.775 149.0557154670121 -2.3375654933887825e9 -117.78 149.0356211196241 -2.33795433289396e9 -117.785 149.0155173654433 -2.3383432238111e9 -117.79 148.99540419634985 -2.3387321661451874e9 -117.795 148.97528160421137 -2.3391211599011993e9 -117.8 148.95514958088125 -2.339510205084123e9 -117.805 148.93500811820047 -2.3398993016989403e9 -117.81 148.91485720799625 -2.3402884497506356e9 -117.815 148.8946968420826 -2.3406776492441936e9 -117.82 148.8745270122599 -2.3410669001845994e9 -117.825 148.85434771031552 -2.34145620257684e9 -117.83 148.83415892802302 -2.3418455564259005e9 -117.835 148.81396065714267 -2.3422349617367687e9 -117.84 148.79375288942097 -2.342624418514433e9 -117.845 148.7735356165913 -2.3430139267638803e9 -117.85 148.75330883037316 -2.343403486490101e9 -117.855 148.73307252247193 -2.343793097698084e9 -117.86 148.71282668458016 -2.344182760392818e9 -117.865 148.6925713083764 -2.344572474579295e9 -117.87 148.67230638552505 -2.344962240262508e9 -117.875 148.65203190767704 -2.3453520574474463e9 -117.88 148.63174786646974 -2.345741926139103e9 -117.885 148.61145425352595 -2.346131846342473e9 -117.89 148.5911510604554 -2.3465218180625477e9 -117.895 148.57083827885307 -2.3469118413043213e9 -117.9 148.55051590030055 -2.347301916072792e9 -117.905 148.53018391636516 -2.3476920423729515e9 -117.91 148.50984231860016 -2.348082220209798e9 -117.915 148.48949109854482 -2.3484724495883284e9 -117.92 148.46913024772414 -2.3488627305135384e9 -117.925 148.44875975764907 -2.349253062990427e9 -117.93 148.42837961981624 -2.3496434470239944e9 -117.935 148.40798982570814 -2.3500338826192374e9 -117.94 148.38759036679267 -2.350424369781156e9 -117.945 148.36718123452394 -2.3508149085147514e9 -117.95 148.34676242034104 -2.3512054988250256e9 -117.955 148.32633391566935 -2.351596140716977e9 -117.96 148.30589571191902 -2.351986834195611e9 -117.965 148.28544780048625 -2.352377579265931e9 -117.97 148.26499017275287 -2.352768375932936e9 -117.975 148.2445228200853 -2.3531592242016344e9 -117.98 148.22404573383622 -2.3535501240770297e9 -117.985 148.20355890534316 -2.353941075564126e9 -117.99 148.18332090000723 -2.3543320786580205e9 -117.995 148.16281461582406 -2.3547231333585186e9 -118. 148.14229849019523 -2.355114239685736e9 -118.005 148.12848122356962 -2.3555053974850197e9 -118.01 148.10846700842748 -2.355896606398082e9 -118.015 148.08792407535333 -2.3562878669448824e9 -118.02 148.0673708618629 -2.3566791791382394e9 -118.025 148.04680735834253 -2.3570705429832115e9 -118.03 148.02623355516224 -2.357461958484853e9 -118.035 148.0056494426745 -2.357853425648221e9 -118.04 147.98505501121483 -2.3582449444783773e9 -118.045 147.96445025110216 -2.3586365149803767e9 -118.05 147.94383515263775 -2.359028137159281e9 -118.055 147.92320970610606 -2.35941981102015e9 -118.06 147.902573901774 -2.3598115365680447e9 -118.065 147.8819277298917 -2.360203313808027e9 -118.07 147.86127118069146 -2.360595142745159e9 -118.075 147.8406042443885 -2.3609870233845043e9 -118.08 147.81992691118054 -2.3613789557311254e9 -118.085 147.79923917124796 -2.3617709397900877e9 -118.09 147.77854101475342 -2.362162975566457e9 -118.095 147.75783243184225 -2.362555063065296e9 -118.1 147.7371134126417 -2.362947202291675e9 -118.105 147.716383947262 -2.36333939325066e9 -118.11 147.69564402579525 -2.363731635947317e9 -118.115 147.6748936383156 -2.364123930386717e9 -118.12 147.65413277487977 -2.364516276573929e9 -118.125 147.6333614255264 -2.3649086745140214e9 -118.13 147.61257958027616 -2.3653011242120657e9 -118.135 147.59178722913185 -2.3656936256731343e9 -118.14 147.57098436207804 -2.366086178902298e9 -118.145 147.55017096908148 -2.3664787839046297e9 -118.15 147.52934704009033 -2.366871440685204e9 -118.155 147.50851256503486 -2.3672641492490935e9 -118.16 147.48766753382725 -2.367656909601373e9 -118.165 147.46681193636067 -2.3680497217471213e9 -118.17 147.44594576251083 -2.368442585691411e9 -118.175 147.4250690021342 -2.36883550143932e9 -118.18 147.40418164506903 -2.369228468995928e9 -118.185 147.38328368113542 -2.3696214883663116e9 -118.19 147.3623751001343 -2.370014559555549e9 -118.195 147.34145589184826 -2.3704076825687222e9 -118.2 147.32052604604084 -2.3708008574109116e9 -118.205 147.2995855524574 -2.3711940840871973e9 -118.21 147.27863440082396 -2.371587362602662e9 -118.215 147.25767258084772 -2.371980692962389e9 -118.22 147.2367000822172 -2.372374075171459e9 -118.225 147.2157168946017 -2.3727675092349586e9 -118.23 147.19472300765133 -2.373160995157974e9 -118.235 147.1737184109974 -2.3735545329455867e9 -118.24 147.15270309425165 -2.373948122602886e9 -118.245 147.13167704700697 -2.374341764134959e9 -118.25 147.1106402588369 -2.3747354575468917e9 -118.255 147.08959271929524 -2.375129202843773e9 -118.26 147.06853441791668 -2.3755230000306935e9 -118.265 147.0474653442164 -2.3759168491127415e9 -118.27 147.02638548769002 -2.376310750095008e9 -118.275 147.00529483781344 -2.3767047029825854e9 -118.28 146.98419338404304 -2.3770987077805643e9 -118.285 146.96308111581536 -2.377492764494038e9 -118.29 146.94195802254714 -2.3778868731281013e9 -118.295 146.9208240936353 -2.378281033687846e9 -118.3 146.89967931845695 -2.3786752461783686e9 -118.305 146.87852368636916 -2.379069510604766e9 -118.31 146.85735718670864 -2.3794638269721317e9 -118.315 146.83617980879254 -2.3798581952855654e9 -118.32 146.81499154191746 -2.380252615550163e9 -118.325 146.79379237535966 -2.3806470877710257e9 -118.33 146.77258229837557 -2.3810416119532504e9 -118.335 146.75136130020078 -2.3814361881019382e9 -118.34 146.73012937005055 -2.3818308162221913e9 -118.345 146.70888649711992 -2.3822254963191094e9 -118.35 146.6876326705831 -2.3826202283977947e9 -118.355 146.66636787959342 -2.3830150124633527e9 -118.36 146.64509211328433 -2.3834098485208845e9 -118.365 146.6238053607676 -2.3838047365754957e9 -118.37 146.60300933787576 -2.3841996766043205e9 -118.375 146.5817008301847 -2.384594668621211e9 -118.38 146.5603813026563 -2.3849897126504765e9 -118.385 146.53905074431765 -2.3853848086972265e9 -118.39 146.51770914417403 -2.385779956766567e9 -118.395 146.49635649121046 -2.38617515686361e9 -118.4 146.4749927743898 -2.3865704089934635e9 -118.405 146.45361798265398 -2.3869657131612387e9 -118.41 146.4322321049237 -2.3873610693720455e9 -118.415 146.41083513009798 -2.3877564776309996e9 -118.42 146.38942704705417 -2.3881519379432106e9 -118.425 146.36800784464842 -2.388547450313793e9 -118.43 146.3465775117147 -2.3889430147478623e9 -118.435 146.3251360370657 -2.389338631250532e9 -118.44 146.30368340949195 -2.389734299826919e9 -118.445 146.28221961776222 -2.39013002048214e9 -118.45 146.26074465062302 -2.3905257932213135e9 -118.455 146.23925849679952 -2.390921618049555e9 -118.46 146.21776114499394 -2.3913174949719853e9 -118.465 146.19625258388677 -2.391713423993725e9 -118.47 146.17473280213602 -2.392109405119893e9 -118.475 146.1532017883776 -2.392505438355611e9 -118.48 146.13165953122473 -2.3929015237060013e9 -118.485 146.1101060192683 -2.3932976611761856e9 -118.49 146.09042756111273 -2.3936938507502666e9 -118.495 146.06885243366528 -2.3940900923310513e9 -118.5 146.04726597137346 -2.39448638604693e9 -118.505 146.02566816264104 -2.394882731903034e9 -118.51 146.0040589958485 -2.395279129904495e9 -118.515 145.98243845935397 -2.39567558005644e9 -118.52 145.96080654149154 -2.3960720823640037e9 -118.525 145.93916323057198 -2.3964686368323193e9 -118.53 145.91750851488285 -2.3968652434665174e9 -118.535 145.8958423826881 -2.397261902271734e9 -118.54 145.874164822228 -2.397658613253104e9 -118.545 145.852475821719 -2.3980553764157624e9 -118.55 145.8307753693539 -2.3984521917648454e9 -118.555 145.80906345330172 -2.398849059305492e9 -118.56 145.78734006170723 -2.399245979042838e9 -118.565 145.76560518269147 -2.3996429509820232e9 -118.57 145.74385880435108 -2.400039975128187e9 -118.575 145.72210091475873 -2.400437051486472e9 -118.58 145.7003315019626 -2.4008341800620165e9 -118.585 145.6785505539865 -2.401231360859963e9 -118.59 145.65675805882958 -2.4016285938854566e9 -118.595 145.6349540044671 -2.402025879143639e9 -118.6 145.61313837884902 -2.4024232166396537e9 -118.605 145.5913111699006 -2.4028206063786497e9 -118.61 145.56947236552264 -2.403218048365769e9 -118.615 145.54762195359066 -2.403615542606159e9 -118.62 145.52575992195526 -2.404013089104971e9 -118.625 145.50388625844215 -2.4044106878673496e9 -118.63 145.4820009508516 -2.404808338898445e9 -118.635 145.46010398695864 -2.4052060422034087e9 -118.64 145.438195354513 -2.4056037977873907e9 -118.645 145.4162750412389 -2.406001605655542e9 -118.65 145.394343034835 -2.4063994658130164e9 -118.655 145.37239932297427 -2.406797378264965e9 -118.66 145.35044389330398 -2.407195343016545e9 -118.665 145.32847673344534 -2.40759336007291e9 -118.67 145.30649783099412 -2.407991429439215e9 -118.675 145.2845071735195 -2.408389551120618e9 -118.68 145.26250474856482 -2.4087877251222754e9 -118.685 145.24049054364707 -2.4091859514493465e9 -118.69 145.21846454625705 -2.409584230106989e9 -118.695 145.196426743859 -2.4099825611003633e9 -118.7 145.17437712389045 -2.4103809444346313e9 -118.705 145.15231567376279 -2.4107793801149535e9 -118.71 145.13024238086038 -2.411177868146492e9 -118.715 145.10846959764874 -2.4115764085172415e9 -118.72 145.08637264545777 -2.4119750012373657e9 -118.725 145.06426372088572 -2.4123736463241987e9 -118.73 145.04276928595783 -2.4127723437530365e9 -118.735 145.02063652383447 -2.413171093530008e9 -118.74 144.9984915662449 -2.4135698956892104e9 -118.745 144.97633439982562 -2.4139687502358403e9 -118.75 144.95416501118348 -2.4143676571750903e9 -118.755 144.93198338689672 -2.414766616512158e9 -118.76 144.909789513514 -2.4151656282522397e9 -118.765 144.88758337755513 -2.4155646924005327e9 -118.77 144.86536496550946 -2.4159638089622364e9 -118.775 144.84313426383747 -2.416362977942551e9 -118.78 144.82089125896988 -2.416762199346676e9 -118.785 144.79863593730698 -2.417161473179811e9 -118.79 144.7763682852199 -2.4175607994471617e9 -118.795 144.75408828904904 -2.417960178153928e9 -118.8 144.73179593510474 -2.418359609305315e9 -118.805 144.70949120966722 -2.41875909290653e9 -118.81 144.68717409898628 -2.4191586289627743e9 -118.815 144.66484458928068 -2.419558217479257e9 -118.82 144.6425026667391 -2.4199578584611864e9 -118.825 144.62014831751873 -2.4203575519137697e9 -118.83 144.5977815277465 -2.4207572978422174e9 -118.835 144.57540228351817 -2.4211570962517385e9 -118.84 144.55301057089792 -2.4215569471475453e9 -118.845 144.5306063759187 -2.4219568505348487e9 -118.85 144.50818968458245 -2.4223568064188623e9 -118.855 144.48576048285895 -2.422756814804802e9 -118.86 144.46331875668702 -2.423156875697879e9 -118.865 144.44086449197283 -2.4235569891033115e9 -118.87 144.41839767459115 -2.4239571550263166e9 -118.875 144.39591829038451 -2.42435737347211e9 -118.88 144.3734263251633 -2.424757644445911e9 -118.885 144.35092176470548 -2.4251579679529395e9 -118.89 144.3494050206328 -2.425558343288632e9 -118.895 144.3554757332677 -2.425958768629197e9 -118.9 144.361546445902 -2.4263592438861246e9 -118.905 144.34362438564003 -2.4267597699903e9 -118.91 144.3211012559033 -2.4271603486161575e9 -118.915 144.29856518506358 -2.42756097980285e9 -118.92 144.27601615812037 -2.4279616635556264e9 -118.925 144.25345416003768 -2.4283623998797407e9 -118.93 144.23087917574475 -2.428763188780448e9 -118.935 144.20829119013592 -2.4291640302630005e9 -118.94 144.18569018806983 -2.429564924332655e9 -118.945 144.16307615437003 -2.4299658709946685e9 -118.95 144.1404490738244 -2.430366870254299e9 -118.955 144.1178089311853 -2.4307679221168036e9 -118.96 144.0951557111686 -2.4311690265874434e9 -118.965 144.07248939845496 -2.4315701836714783e9 -118.97 144.04980997768806 -2.43197139337417e9 -118.975 144.02711743347595 -2.432372655700781e9 -118.98 144.0044117503896 -2.432773970656576e9 -118.985 143.98169291296395 -2.433175338246818e9 -118.99 143.95896090569653 -2.4335767584767723e9 -118.995 143.93621571304826 -2.433978231351709e9 -119. 143.91345731944284 -2.4343797568768916e9 -119.005 143.8906857092665 -2.4347813350575905e9 -119.01 143.86790086686833 -2.435182965899076e9 -119.015 143.8451027765596 -2.435584649406617e9 -119.02 143.8222914226141 -2.4359863855854874e9 -119.025 143.7994667892671 -2.436388174440959e9 -119.03 143.77662886071627 -2.436790015978304e9 -119.035 143.7537776211208 -2.4371919102027984e9 -119.04 143.73091305460127 -2.437593857119719e9 -119.045 143.70803514524022 -2.43799585673434e9 -119.05 143.68514387708063 -2.438397909051941e9 -119.055 143.66223923412687 -2.4388000140778017e9 -119.06 143.6393212003443 -2.439202171817199e9 -119.065 143.61638975965883 -2.439604382275416e9 -119.07 143.59344489595688 -2.4400066454577336e9 -119.075 143.57048659308495 -2.4404089613694367e9 -119.08 143.54751483485 -2.4408113300158067e9 -119.085 143.52452960501904 -2.44121375140213e9 -119.09 143.50153088731818 -2.4416162255336943e9 -119.095 143.4785186654343 -2.442018752415783e9 -119.1 143.4554929230126 -2.4424213320536866e9 -119.105 143.43245364365768 -2.4428239644526944e9 -119.11 143.40940081093373 -2.4432266496180954e9 -119.115 143.38633440836358 -2.4436293875551815e9 -119.12 143.36325441942813 -2.4440321782692466e9 -119.125 143.34016082756733 -2.4444350217655816e9 -119.13 143.3170536161795 -2.4448379180494823e9 -119.135 143.29393276862024 -2.445240867126245e9 -119.14 143.27079826820415 -2.4456438690011644e9 -119.145 143.24765009820246 -2.4460469236795406e9 -119.15 143.22448824184434 -2.446450031166671e9 -119.155 143.20131268231643 -2.446853191467854e9 -119.16 143.1784270969352 -2.4472564045875463e9 -119.165 143.15522424464848 -2.447659670505101e9 -119.17 143.13200763783317 -2.448062989252601e9 -119.175 143.1087772595011 -2.448466360835353e9 -119.18 143.0855330926207 -2.4488697852586613e9 -119.185 143.06227512011645 -2.449273262527831e9 -119.19 143.03900332486853 -2.4496767926481705e9 -119.195 143.0157176897127 -2.450080375624989e9 -119.2 142.99241819743997 -2.450484011463597e9 -119.205 142.96910483079688 -2.450887700169302e9 -119.21 142.94577757248464 -2.451291441747418e9 -119.215 142.9224364051589 -2.4516952362032585e9 -119.22 142.89908131143048 -2.452099083542136e9 -119.225 142.87571227386385 -2.4525029837693663e9 -119.23 142.85232927497785 -2.452906936890266e9 -119.235 142.82893229724493 -2.4533109429101515e9 -119.24 142.80552132309117 -2.453715001834342e9 -119.245 142.7820963348958 -2.4541191136681585e9 -119.25 142.75865731499167 -2.454523278416918e9 -119.255 142.73520424566428 -2.4549274960859447e9 -119.26 142.71173710915116 -2.4553317666805625e9 -119.265 142.6882558876432 -2.455736090206093e9 -119.27 142.66476056328264 -2.456140466667863e9 -119.275 142.641251118164 -2.4565448960711994e9 -119.28 142.61772753433317 -2.456949378421427e9 -119.285 142.5941897937879 -2.457353913723877e9 -119.29 142.57063787847648 -2.457758501983879e9 -119.295 142.54707177029883 -2.458163143206761e9 -119.3 142.52349145110458 -2.4585678373978577e9 -119.305 142.4998969026945 -2.458972584562503e9 -119.31 142.47628810681917 -2.459377384706028e9 -119.315 142.4526650451791 -2.4597822378337703e9 -119.32 142.42902769942415 -2.460187143951066e9 -119.325 142.40537605115364 -2.460592103063254e9 -119.33 142.38171008191622 -2.4609971151756716e9 -119.335 142.35802977320878 -2.4614021802936583e9 -119.34 142.33433510647728 -2.4618072984225583e9 -119.345 142.31062606311528 -2.4622124695677114e9 -119.35 142.2869026244648 -2.462617693734461e9 -119.355 142.2631647718153 -2.4630229709281545e9 -119.36 142.2394124864036 -2.4634283011541348e9 -119.365 142.21564574941345 -2.4638336844177504e9 -119.37 142.19186454197572 -2.464239120724351e9 -119.375 142.16806884516777 -2.4646446100792828e9 -119.38 142.1442586400129 -2.4650501524878983e9 -119.385 142.12043390748016 -2.46545574795555e9 -119.39 142.09659462848506 -2.46586139648759e9 -119.395 142.0727407838875 -2.4662670980893717e9 -119.4 142.04887235449257 -2.466672852766253e9 -119.405 142.0249893210506 -2.467078660523588e9 -119.41 142.00109166425557 -2.4674845213667355e9 -119.415 141.97717936474575 -2.4678904353010564e9 -119.42 141.9532524031036 -2.4682964023319073e9 -119.425 141.92931075985433 -2.4687024224646516e9 -119.43 141.9053544154665 -2.4691084957046537e9 -119.435 141.88176537217748 -2.469514622050731e9 -119.44 141.85777971441544 -2.4699208014865704e9 -119.445 141.83377917915186 -2.470327034045755e9 -119.45 141.8105300740311 -2.4707333197094574e9 -119.455 141.78649998721323 -2.4711396584617796e9 -119.46 141.7624547261434 -2.4715460503535786e9 -119.465 141.73839427002505 -2.4719524953902564e9 -119.47 141.71431859799927 -2.472358993577218e9 -119.475 141.6902276891444 -2.47276554491987e9 -119.48 141.66612152247512 -2.47317214942362e9 -119.485 141.64200007694328 -2.473578807093878e9 -119.49 141.6178633314363 -2.4739855179360504e9 -119.495 141.59371126477723 -2.474392281955553e9 -119.5 141.5695438557242 -2.4747990991577954e9 -119.505 141.54536108297083 -2.475205969548193e9 -119.51 141.52116292514455 -2.4756128931321616e9 -119.515 141.4969493608072 -2.4760198699151173e9 -119.52 141.47272036845428 -2.476426899902478e9 -119.525 141.44847592651442 -2.4768339830996647e9 -119.53 141.42421601334934 -2.477241119512097e9 -119.535 141.399940607253 -2.4776483091451955e9 -119.54 141.37564968645117 -2.4780555520043874e9 -119.545 141.35134322910193 -2.478462848095094e9 -119.55 141.32702121329353 -2.478870197422743e9 -119.555 141.30268361704586 -2.4792775999927626e9 -119.56 141.2783304183086 -2.4796850558105803e9 -119.565 141.25396159496123 -2.480092564881627e9 -119.57 141.2295771248131 -2.4805001272113357e9 -119.575 141.20517698560187 -2.4809077428051386e9 -119.58 141.18076115499443 -2.4813154116684694e9 -119.585 141.15632961058512 -2.4817231338067646e9 -119.59 141.13188232989597 -2.482130909225462e9 -119.595 141.10741929037638 -2.4825387379299994e9 -119.6 141.08294046940205 -2.4829466199258165e9 -119.605 141.05844584427516 -2.483354555218356e9 -119.61 141.03393539222307 -2.48376254381306e9 -119.615 141.00940909039895 -2.4841705857153726e9 -119.62 140.98486691587993 -2.4845786809307404e9 -119.625 140.96030884566778 -2.4849868294646096e9 -119.63 140.93573485668793 -2.4853950313224287e9 -119.635 140.91114492578862 -2.4858032865096493e9 -119.64 140.88653902974116 -2.4862115950317206e9 -119.645 140.86191714523852 -2.4866199568940964e9 -119.65 140.83727924889558 -2.4870283721022325e9 -119.655 140.81262531724803 -2.4874368406615815e9 -119.66 140.7879553267521 -2.487845362577602e9 -119.665 140.76326925378424 -2.488253937855755e9 -119.67 140.73856707463992 -2.488662566501497e9 -119.675 140.71384876553344 -2.4890712485202913e9 -119.68 140.6891143025976 -2.4894799839176016e9 -119.685 140.6643636618828 -2.4898887726988916e9 -119.69 140.63959681935657 -2.490297614869626e9 -119.695 140.61481375090287 -2.490706510435274e9 -119.7 140.5900144323212 -2.4911154594013057e9 -119.705 140.56519883932734 -2.4915244617731895e9 -119.71 140.54036694755084 -2.4919335175563974e9 -119.715 140.51551873253575 -2.4923426267564054e9 -119.72 140.49065416973983 -2.492751789378685e9 -119.725 140.46577323453297 -2.493161005428715e9 -119.73 140.44087590219803 -2.4935702749119735e9 -119.735 140.4159621479289 -2.4939795978339376e9 -119.74 140.3910319468305 -2.4943889742000914e9 -119.745 140.3660852739181 -2.494798404015917e9 -119.75 140.34112210411655 -2.4952078872868967e9 -119.755 140.3161424122593 -2.4956174240185175e9 -119.76 140.29114617308824 -2.4960270142162676e9 -119.765 140.2661333612528 -2.496436657885634e9 -119.77 140.2411039513091 -2.4968463550321074e9 -119.775 140.21605791771927 -2.497256105661182e9 -119.78 140.19099523485102 -2.497665909778348e9 -119.785 140.1659158769766 -2.498075767389103e9 -119.79 140.14081981827198 -2.4984856784989424e9 -119.795 140.1157070328167 -2.498895643113364e9 -119.8 140.09057749459222 -2.4993056612378693e9 -119.805 140.06543117748186 -2.49971573287796e9 -119.81 140.04026805526993 -2.500125858039137e9 -119.815 140.01508810164046 -2.500536036726906e9 -119.82 139.98989129017696 -2.500946268946773e9 -119.825 139.96467759436115 -2.501356554704249e9 -119.83 139.93944698757264 -2.501766894004839e9 -119.835 139.9141994430879 -2.502177286854056e9 -119.84 139.88893493407897 -2.5025877332574143e9 -119.845 139.8636534336134 -2.5029982332204256e9 -119.85 139.83835491465265 -2.503408786748608e9 -119.855 139.81303935005172 -2.50381939384748e9 -119.86 139.7877067125582 -2.504230054522558e9 -119.865 139.7623569748109 -2.5046407687793655e9 -119.87 139.73699010933956 -2.505051536623427e9 -119.875 139.71160608856366 -2.505462358060263e9 -119.88 139.68620488479147 -2.505873233095402e9 -119.885 139.660786470219 -2.506284161734372e9 -119.89 139.6353508169293 -2.506695143982701e9 -119.895 139.6098978968914 -2.5071061798459215e9 -119.9 139.58442768195877 -2.5075172693295674e9 -119.905 139.5589401438695 -2.507928412439172e9 -119.91 139.53343525424413 -2.5083396091802707e9 -119.915 139.507912984585 -2.508750859558406e9 -119.92 139.4823733062759 -2.5091621635791135e9 -119.925 139.45681619057964 -2.5095735212479362e9 -119.93 139.43124160863803 -2.5099849325704203e9 -119.935 139.40564953147086 -2.510396397552106e9 -119.94 139.39148251659455 -2.510807915991768e9 -119.945 139.3658627135433 -2.51121948730433e9 -119.95 139.34022483685553 -2.5116311122922015e9 -119.955 139.31456885569523 -2.5120427909609785e9 -119.96 139.2888947390933 -2.51245452331626e9 -119.965 139.26320245594596 -2.512866309363644e9 -119.97 139.23749197501368 -2.513278149108733e9 -119.975 139.21176326491957 -2.51369004255713e9 -119.98 139.186016294148 -2.5141019897144427e9 -119.985 139.16025103104434 -2.514513990586274e9 -119.99 139.1344674438123 -2.5149260451782374e9 -119.995 139.10866550051307 -2.5153381534959426e9 -120. 139.0828451690646 -2.5157503155450025e9 -120.005 139.0570064172393 -2.5161625313310328e9 -120.01 139.03114921266285 -2.516574800859651e9 -120.015 139.00527352281355 -2.516987124136476e9 -120.02 138.9793793150196 -2.5173995011671286e9 -120.025 138.95346655645855 -2.517811931957233e9 -120.03 138.9275352141557 -2.518224416512414e9 -120.035 138.90158525498217 -2.5186369548382983e9 -120.04 138.8756166456534 -2.5190495469405165e9 -120.045 138.84962935272836 -2.5194621928246984e9 -120.05 138.8236233426072 -2.519874892496478e9 -120.055 138.79759858152926 -2.520287645961493e9 -120.06 138.77155503557273 -2.520700453225376e9 -120.065 138.74549267065177 -2.5211133142937713e9 -120.07 138.71941145251546 -2.5215262291723185e9 -120.075 138.6933113467458 -2.521939197866663e9 -120.08 138.6671923187559 -2.522352220382448e9 -120.08500000000001 138.64105433378862 -2.5227652967253256e9 -120.09 138.61489735691433 -2.5231784269009414e9 -120.095 138.58872135302903 -2.523591610914951e9 -120.1 138.56252628685291 -2.524004848773007e9 -120.105 138.53631212292785 -2.524418140480769e9 -120.11 138.51007882561612 -2.524831486043893e9 -120.115 138.48382635909795 -2.525244885468041e9 -120.12 138.45755468736945 -2.5256583387588773e9 -120.125 138.43173810920703 -2.5260718459135284e9 -120.13 138.40542814673083 -2.526485406913012e9 -120.135 138.37909871445558 -2.5268990217961783e9 -120.14 138.35370156798982 -2.5273126905175104e9 -120.145 138.3273334232208 -2.527726413101439e9 -120.15 138.30094538295103 -2.528140189586107e9 -120.155 138.2745374084031 -2.5285540199772315e9 -120.16 138.2481094605916 -2.5289679042805376e9 -120.165 138.22166150032075 -2.5293818425017524e9 -120.17 138.19519348818224 -2.529795834646598e9 -120.175 138.16870538455152 -2.530209880720809e9 -120.18 138.1421971495866 -2.530623980730118e9 -120.185 138.11566874322514 -2.531038134680258e9 -120.19 138.08912012518124 -2.5314523425769663e9 -120.195 138.06255125494337 -2.5318666044259844e9 -120.2 138.03596209177107 -2.5322809202330546e9 -120.205 138.0093525946927 -2.53269529000392e9 -120.21000000000001 137.982722722502 -2.5331097137443323e9 -120.215 137.956072433756 -2.5335241914600363e9 -120.22 137.9294016867711 -2.5339387231567874e9 -120.225 137.90271043962082 -2.5343533088403406e9 -120.23 137.875998650132 -2.5347679485164566e9 -120.235 137.8492662758827 -2.5351826421908903e9 -120.24 137.82251327419775 -2.535597389869406e9 -120.245 137.7957396021461 -2.5360121915577745e9 -120.25 137.76894521653807 -2.5364270472617583e9 -120.255 137.74213007392058 -2.53684195698713e9 -120.26 137.71529413057488 -2.537256920739666e9 -120.265 137.68843734251237 -2.537671938525139e9 -120.27 137.66155966547154 -2.5380870103493295e9 -120.275 137.63466105491338 -2.5385021362180214e9 -120.28 137.6077414660184 -2.5389173161369963e9 -120.285 137.58080085368266 -2.539332550112043e9 -120.29 137.55383917251348 -2.539747838148952e9 -120.295 137.5268563768259 -2.5401631802535152e9 -120.3 137.49985242063795 -2.5405785764315305e9 -120.305 137.4728272576674 -2.5409940266887946e9 -120.31 137.44578084132627 -2.5414095310311093e9 -120.315 137.41871312471778 -2.5418250894642806e9 -120.32 137.39162406063076 -2.542240701994114e9 -120.325 137.36451360153572 -2.542656368626421e9 -120.33 137.33738169958013 -2.5430720893670154e9 -120.33500000000001 137.31022830658318 -2.5434878642217126e9 -120.34 137.28305337403168 -2.5439036931963315e9 -120.345 137.25585685307453 -2.544319576296694e9 -120.35 137.22863869451763 -2.544735513528626e9 -120.355 137.2013988488185 -2.545151504897957e9 -120.36 137.17413726608194 -2.545567550410517e9 -120.365 137.14685389605333 -2.5459836500721397e9 -120.37 137.1195486881133 -2.5463998038886666e9 -120.375 137.09222159127296 -2.546816011865934e9 -120.38 137.06487255416684 -2.547232274009787e9 -120.385 137.0375015250472 -2.5476485903260756e9 -120.39 137.01010845177876 -2.5480649608206463e9 -120.395 136.98269328183093 -2.548481385499355e9 -120.4 136.9552559622726 -2.548897864368058e9 -120.405 136.92779643976488 -2.5493143974326153e9 -120.41 136.90031466055487 -2.5497309846988897e9 -120.415 136.87281057046775 -2.5501476261727514e9 -120.42 136.84528411490078 -2.550564321860067e9 -120.425 136.81773523881543 -2.550981071766711e9 -120.43 136.79016388672986 -2.551397875898562e9 -120.435 136.76257000271139 -2.5518147342614985e9 -120.44 136.73495353036887 -2.5522316468614063e9 -120.445 136.70731441284397 -2.5526486137041726e9 -120.45 136.67965259280345 -2.553065634795688e9 -120.455 136.65196801243056 -2.5534827101418476e9 -120.46000000000001 136.62426061341623 -2.5538998397485495e9 -120.465 136.59653033694977 -2.5543170236216955e9 -120.47 136.56877712371065 -2.554734261767191e9 -120.475 136.54100091385757 -2.555151554190947e9 -120.48 136.51320164702022 -2.5555689008988757e9 -120.485 136.48537926228832 -2.5559863018968935e9 -120.49 136.4575336982014 -2.556403757190922e9 -120.495 136.4296648927392 -2.5568212667868853e9 -120.5 136.40177278330972 -2.557238830690711e9 -120.505 136.3738573067381 -2.5576564489083333e9 -120.51 136.3459183992562 -2.5580741214456887e9 -120.515 136.31795599648962 -2.558491848308716e9 -120.52 136.28997003344608 -2.55890962950336e9 -120.525 136.26196044450253 -2.559327465035571e9 -120.53 136.23392716339333 -2.559745354911299e9 -120.535 136.2058701231952 -2.5601632991365023e9 -120.54 136.17778925631526 -2.5605812977171435e9 -120.545 136.1496844944755 -2.5609993506591854e9 -120.55 136.12155576869978 -2.5614174579685984e9 -120.555 136.09340300929733 -2.5618356196513577e9 -120.56 136.0652261458479 -2.56225383571344e9 -120.565 136.0370251071865 -2.5626721061608286e9 -120.57 136.00879982138596 -2.5630904309995117e9 -120.575 135.98055021574032 -2.5635088102354813e9 -120.58 135.95227621674744 -2.563927243874732e9 -120.58500000000001 135.92397775009073 -2.564345731923269e9 -120.59 135.89565474062084 -2.5647642743870935e9 -120.595 135.8673071123357 -2.565182871272218e9 -120.6 135.83893478836117 -2.5656015225846586e9 -120.605 135.81053769093018 -2.5660202283304367e9 -120.61 135.78211574136117 -2.5664389885155754e9 -120.615 135.75366886003647 -2.566857803146106e9 -120.62 135.7251969663793 -2.567276672228064e9 -120.625 135.69669997883008 -2.5676955957674894e9 -120.63 135.66817781482186 -2.5681145737704277e9 -120.635 135.63963039075523 -2.568533606242933e9 -120.64 135.61105762197184 -2.568952693191057e9 -120.645 135.58245942272725 -2.569371834620865e9 -120.65 135.55383570616314 -2.5697910305384226e9 -120.655 135.5251863842774 -2.570210280949802e9 -120.66 135.49651136789373 -2.570629585861083e9 -120.665 135.46781056663067 -2.571048945278351e9 -120.67 135.4390838888691 -2.5714683592076926e9 -120.675 135.41033124171724 -2.5718878276552052e9 -120.68 135.3815525309759 -2.572307350626992e9 -120.685 135.35274766110243 -2.57272692812916e9 -120.69 135.32391653517098 -2.5731465601678214e9 -120.695 135.29505905483452 -2.5735662467490983e9 -120.7 135.26617512028213 -2.573985987879118e9 -120.705 135.23726463019707 -2.5744057835640116e9 -120.71000000000001 135.20832748171082 -2.5748256338099213e9 -120.715 135.17936357035776 -2.57524553862299e9 -120.72 135.15037279002533 -2.575665498009373e9 -120.725 135.1213550329035 -2.5760855119752293e9 -120.73 135.09231018943197 -2.5765055805267277e9 -120.735 135.06323814824495 -2.576925703670039e9 -120.74 135.03413879611296 -2.5773458814113464e9 -120.745 135.0050120178828 -2.5777661137568398e9 -120.75 134.97585769641407 -2.5781864007127113e9 -120.755 134.94667571251318 -2.5786067422851686e9 -120.76 134.91746594486452 -2.5790271384804215e9 -120.765 134.88822826995766 -2.5794475893046885e9 -120.77 134.8589625620113 -2.5798680947641983e9 -120.775 134.82966869289407 -2.5802886548651876e9 -120.78 134.80034653204103 -2.580709269613898e9 -120.785 134.77099594636564 -2.581129939016584e9 -120.79 134.74222006914792 -2.581550663035261e9 -120.795 134.71281250336722 -2.581971441713581e9 -120.8 134.68458627548443 -2.582392275008989e9 -120.805 134.65512117198412 -2.582813162936696e9 -120.81 134.62562628351824 -2.5832341055497775e9 -120.815 134.5961014570205 -2.5836551028545985e9 -120.82 134.5665465361208 -2.5840761548575335e9 -120.825 134.53696136101252 -2.584497261564966e9 -120.83 134.51101154407942 -2.584918422754498e9 -120.83500000000001 134.48136889310646 -2.58533963863054e9 -120.84 134.45169538412458 -2.5857609092300563e9 -120.845 134.4219908419781 -2.5861822345594835e9 -120.85 134.39225508730019 -2.586603614625267e9 -120.855 134.3624879363259 -2.5870250494338694e9 -120.86 134.33268920069585 -2.5874465389917583e9 -120.865 134.30285868724604 -2.587868083305418e9 -120.87 134.2729961977842 -2.5882896823813477e9 -120.875 134.24310152885428 -2.588711336226053e9 -120.88 134.21317447148206 -2.5891330448460603e9 -120.885 134.1832148109058 -2.5895548082479067e9 -120.89 134.15322232628927 -2.5899766264381437e9 -120.895 134.12319679041272 -2.590398499423339e9 -120.9 134.09313796934433 -2.5908204272100754e9 -120.905 134.06304562208751 -2.591242409804947e9 -120.91 134.03291950020133 -2.591664447214573e9 -120.915 134.00275934739508 -2.592086539445583e9 -120.92 133.97256489909012 -2.5925086865046234e9 -120.925 133.94233588194948 -2.592930888398363e9 -120.93 133.91207201336917 -2.5933531451334863e9 -120.935 133.88177300093028 -2.593775456716697e9 -120.94 133.85143854180495 -2.59419782315472e9 -120.945 133.82106832211295 -2.5946202444543e9 -120.95 133.79066201622396 -2.595042720622204e9 -120.955 133.76021928599846 -2.5954652516652193e9 -120.96000000000001 133.72973977996102 -2.5958878375901594e9 -120.965 133.69922313239854 -2.596310478403859e9 -120.97 133.66866896237286 -2.596733174113179e9 -120.975 133.63807687264136 -2.5971559247250094e9 -120.98 133.6074464484694 -2.5975787302462626e9 -120.985 133.5767772563243 -2.5980015906838837e9 -120.99 133.5469365940403 -2.5984245060167565e9 -120.995 133.51618958466446 -2.598847476222184e9 -121. 133.48540239172502 -2.599270501364915e9 -121.005 133.45457449120153 -2.5996935814520206e9 -121.01 133.4237053313866 -2.600116716490612e9 -121.015 133.39279433044538 -2.600539906487834e9 -121.02 133.3618408736758 -2.6009631514508743e9 -121.025 133.33084431042352 -2.601386451386966e9 -121.03 133.29980395059798 -2.6018098063033834e9 -121.035 133.26871906071898 -2.6022332162074523e9 -121.04 133.23758885941245 -2.602656681106552e9 -121.045 133.20641251226078 -2.6030802010081124e9 -121.05 133.17518912587923 -2.6035037759196253e9 -121.055 133.14391774107506 -2.603927405848647e9 -121.06 133.11259732490169 -2.6043510908027997e9 -121.065 133.08122676137307 -2.6047748307897806e9 -121.07 133.04980484054738 -2.605198625817365e9 -121.075 133.0183302456022 -2.60562247589342e9 -121.08 132.98680153741986 -2.606046381025902e9 -121.08500000000001 132.9552171360501 -2.6064703412228746e9 -121.09 132.9235752982198 -2.606894356492512e9 -121.095 132.8918740897725 -2.6073184268431206e9 -121.1 132.86011135153117 -2.607742552283144e9 -121.105 132.8282846564892 -2.608166732821187e9 -121.11 132.79639125539745 -2.6085909684660296e9 -121.115 132.7644280065238 -2.609015259226657e9 -121.12 132.7323912833845 -2.609439605112291e9 -121.125 132.70027685107578 -2.609864006132419e9 -121.13 132.66807969660695 -2.6102884622968535e9 -121.135 132.63579378965017 -2.6107129736157875e9 -121.14 132.60341173394713 -2.6111375400998755e9 -121.145 132.57092423879376 -2.611562161760349e9 -121.15 132.53831927714126 -2.6119868386091785e9 -121.155 132.50558065696313 -2.6124115706592984e9 -121.16 132.47268538427744 -2.6128363579249907e9 -121.165 132.43959818477788 -2.6132612004225216e9 -121.17 132.40625785590254 -2.6136860981713862e9 -121.175 132.37252993083334 -2.6141110511973896e9 -121.18 132.33765137902319 -2.614536059547393e9 -121.185 132.30317207697524 -2.61496112328726e9 -121.19 132.26942926108066 -2.6153862423523645e9 -121.195 132.23598028896762 -2.6158114167158523e9 -121.2 132.20271235017347 -2.6162366463659244e9 -121.205 132.16957132947343 -2.6166619312962174e9 -121.21000000000001 132.1365253212326 -2.6170872715032744e9 -121.215 132.10355327565327 -2.617512666985442e9 -121.22 132.07064026801987 -2.617938117742307e9 -121.225 132.0377751692675 -2.618363623774355e9 -121.23 132.0049493645073 -2.6187891850827575e9 -121.235 131.97215598954347 -2.619214801669216e9 -121.24 131.93938944767135 -2.6196404735358734e9 -121.245 131.90664508899405 -2.6200662006852226e9 -121.25 131.87391898926455 -2.6204919831200542e9 -121.255 131.84120779245532 -2.6209178208434153e9 -121.26 131.80850859566573 -2.6213437138585696e9 -121.265 131.7758188630475 -2.621769662168968e9 -121.27 131.74313636015833 -2.622195665778228e9 -121.275 131.71045910302792 -2.622621724690116e9 -121.28 131.67778531804626 -2.623047838908525e9 -121.285 131.6451134099427 -2.623474008437467e9 -121.29 131.6124419359222 -2.623900233281062e9 -121.295 131.57976958454896 -2.6243265134435196e9 -121.3 131.54709515833514 -2.624752848929142e9 -121.305 131.5144175592615 -2.6251792397423086e9 -121.31 131.48173577663783 -2.625605685887471e9 -121.315 131.4490488768489 -2.6260321873691487e9 -121.32 131.41635599463564 -2.626458744191924e9 -121.325 131.38365632563506 -2.6268853563604383e9 -121.33 131.35094911996066 -2.627312023879383e9 -121.33500000000001 131.31823367664614 -2.627738746753502e9 -121.34 131.28550933881712 -2.628165524987585e9 -121.345 131.2527754894697 -2.6285923585864644e9 -121.35 131.22003154776888 -2.6290192475550175e9 -121.355 131.18727696578685 -2.629446191898159e9 -121.36 131.1545112256187 -2.629873191620836e9 -121.365 131.12173383682148 -2.6303002467280354e9 -121.37 131.08894433413437 -2.6307273572247744e9 -121.375 131.05614227544157 -2.631154523116101e9 -121.38 131.02332723994675 -2.6315817444070926e9 -121.385 130.99049882653162 -2.632009021102858e9 -121.39 130.95765665227842 -2.6324363532085257e9 -121.395 130.92480035113255 -2.6328637407292557e9 -121.4 130.89192957269282 -2.633291183670232e9 -121.405 130.8590439811139 -2.6337186820366564e9 -121.41 130.8269169014502 -2.634146235789713e9 -121.415 130.79400070780832 -2.6345738449596953e9 -121.42 130.76261907567232 -2.635001509491253e9 -121.425 130.72967054490033 -2.6354292294226737e9 -121.43 130.69670479421788 -2.635857004805991e9 -121.435 130.66372155461673 -2.6362848356466036e9 -121.44 130.63072056617736 -2.636712721949931e9 -121.445 130.59770157752345 -2.637140663721409e9 -121.45 130.56466434531896 -2.6375686609664907e9 -121.455 130.53160863380162 -2.637996713690643e9 -121.46000000000001 130.49853421435182 -2.638424821899349e9 -121.465 130.46544086509223 -2.6388529855981064e9 -121.47 130.4323283705165 -2.6392812047924304e9 -121.475 130.39919652114372 -2.639709479487844e9 -121.48 130.36604511319595 -2.640137809689892e9 -121.485 130.3328739482991 -2.6405661954041233e9 -121.49 130.2996828332021 -2.6409946366361074e9 -121.495 130.26647157951552 -2.6414231333914223e9 -121.5 130.23324000346696 -2.6418516856756573e9 -121.505 130.19998792567088 -2.642280293494416e9 -121.51 130.1667151709148 -2.6427089568533134e9 -121.515 130.1334215679567 -2.6431376757579727e9 -121.52 130.10010694933564 -2.6435664502140317e9 -121.525 130.0667711511939 -2.643995280227138e9 -121.53 130.0334140131087 -2.6444241658029466e9 -121.535 130.00003537793467 -2.6448531069471273e9 -121.54 129.9666350916545 -2.6452821036653566e9 -121.545 129.93321300323916 -2.6457111559633217e9 -121.55 129.89976896451395 -2.646140263846719e9 -121.555 129.8663028300336 -2.646569427321255e9 -121.56 129.83281445696443 -2.646998646392644e9 -121.565 129.79930370497044 -2.647427921066611e9 -121.57 129.76577043610754 -2.6478572513488894e9 -121.575 129.73221451472358 -2.6482866372452197e9 -121.58 129.69863580736128 -2.648716078761351e9 -121.58500000000001 129.66503418266728 -2.649145575903044e9 -121.59 129.63140951130768 -2.649575128676063e9 -121.595 129.59776166588398 -2.650004737086182e9 -121.6 129.56409052085584 -2.650434401139184e9 -121.605 129.53039595246665 -2.65086412084086e9 -121.61 129.49667783867278 -2.651293896197005e9 -121.615 129.46293605907672 -2.6517237272134256e9 -121.62 129.42917049486147 -2.652153613895935e9 -121.625 129.39538102873115 -2.65258355625035e9 -121.63 129.36156754484995 -2.653013554282499e9 -121.635 129.32772992878844 -2.6534436079982166e9 -121.64 129.29386806746922 -2.653873717403341e9 -121.645 129.2599818491157 -2.65430388250372e9 -121.65 129.22607116320313 -2.6547341033052115e9 -121.655 129.19213590041267 -2.6551643798136716e9 -121.66 129.1581759525855 -2.6555947120349703e9 -121.665 129.12419121268064 -2.656025099974981e9 -121.67 129.09018157473338 -2.6564555436395826e9 -121.675 129.07819014104516 -2.6568860421148086e9 -121.68 129.04414510789752 -2.657316595493293e9 -121.685 129.01007369932157 -2.6577472046131477e9 -121.69 128.97597580898102 -2.6581778694803762e9 -121.695 128.9418513314203 -2.6586085901009827e9 -121.7 128.9077001620327 -2.6590393664809794e9 -121.705 128.87352219702754 -2.659470198626383e9 -121.71000000000001 128.8393173334011 -2.6599010865432177e9 -121.715 128.80508546890675 -2.6603320302375126e9 -121.72 128.77082650202777 -2.6607630297153053e9 -121.725 128.73654033194984 -2.6611940849826365e9 -121.73 128.70222685853497 -2.6616251960455556e9 -121.735 128.6678859822969 -2.6620563629101133e9 -121.74 128.63351760437706 -2.6624875855823703e9 -121.745 128.5991216265207 -2.6629188640683937e9 -121.75 128.5646979510552 -2.663350198374251e9 -121.755 128.5302464808675 -2.6637815885060186e9 -121.76 128.4957671193839 -2.664213034469782e9 -121.765 128.46125977054976 -2.6646445362716246e9 -121.77 128.4267243388097 -2.6650760939176416e9 -121.775 128.39216072908835 -2.665507707413931e9 -121.78 128.35756884677346 -2.665939376766595e9 -121.785 128.3229485976965 -2.6663711019817452e9 -121.79 128.28829988811674 -2.6668028830654964e9 -121.795 128.25362262470466 -2.667234720023966e9 -121.8 128.2189167145246 -2.6676666128632803e9 -121.805 128.18418206502133 -2.668098561589571e9 -121.81 128.14941858400326 -2.668530566208972e9 -121.815 128.11462617962897 -2.6689626267276244e9 -121.82 128.07980476039182 -2.6693947431516743e9 -121.825 128.04495423510792 -2.6698269154872746e9 -121.83 128.0100745129012 -2.6702591437405787e9 -121.83500000000001 127.97516550319146 -2.6706914279177504e9 -121.84 127.9402271156819 -2.671123768024953e9 -121.845 127.90525926034579 -2.6715561640683603e9 -121.85 127.8702618474163 -2.6719886160541477e9 -121.855 127.83523478737325 -2.672421123988498e9 -121.86 127.80017799093399 -2.672853687877596e9 -121.865 127.76509136904018 -2.6732863077276316e9 -121.87 127.72997483284915 -2.6737189835448046e9 -121.875 127.69482829372244 -2.6741517153353114e9 -121.88 127.65965166321642 -2.674584503105361e9 -121.885 127.6244448530721 -2.6750173468611646e9 -121.89 127.58920777520605 -2.675450246608935e9 -121.895 127.55394034170092 -2.675883202354895e9 -121.9 127.51864246479626 -2.6763162141052685e9 -121.905 127.48331405688029 -2.6767492818662863e9 -121.91 127.44795503048063 -2.6771824056441813e9 -121.915 127.41256529825615 -2.677615585445195e9 -121.92 127.37714477298944 -2.6780488212755694e9 -121.925 127.3416933675782 -2.6784821131415553e9 -121.93 127.30621099502724 -2.678915461049406e9 -121.935 127.27069756844192 -2.6793488650053782e9 -121.94 127.23515300101954 -2.6797823250157366e9 -121.945 127.1995772060434 -2.680215841086747e9 -121.95 127.16397009687414 -2.6806494132246847e9 -121.955 127.12833158694438 -2.6810830414358234e9 -121.96000000000001 127.09266158975117 -2.681516725726445e9 -121.965 127.05696001884942 -2.6819504661028376e9 -121.97 127.02122678784559 -2.6823842625712895e9 -121.975 126.98546181039136 -2.682818115138097e9 -121.98 126.94966500017674 -2.6832520238095627e9 -121.985 126.91383627092596 -2.6836859885919857e9 -121.99 126.87797553638906 -2.6841200094916787e9 -121.995 126.84208271033768 -2.6845540865149555e9 -122. 126.8061577065589 -2.6849882196681323e9 -122.005 126.7702004388498 -2.6854224089575324e9 -122.01 126.73421082101147 -2.6858566543894844e9 -122.015 126.69916607060044 -2.6862909559668803e9 -122.02 126.66311212390139 -2.6867253136260796e9 -122.025 126.62898550697113 -2.6871597274196143e9 -122.03 126.59286661238691 -2.6875941972542157e9 -122.035 126.5567136828701 -2.6880287232630816e9 -122.04 126.52052662726234 -2.6884633054526677e9 -122.045 126.48430535434423 -2.688897943829428e9 -122.05 126.4480497728291 -2.689332638399827e9 -122.055 126.41175979135951 -2.6897673891703343e9 -122.06 126.37543531850221 -2.690202196147418e9 -122.065 126.33907626274325 -2.6906370593375573e9 -122.07 126.30268253248364 -2.691071978747234e9 -122.075 126.26625403603511 -2.6915069543829355e9 -122.08 126.2297906816161 -2.6919419862511497e9 -122.08500000000001 126.19329237734584 -2.6923770743583784e9 -122.09 126.15675903124266 -2.6928122187111163e9 -122.095 126.12019055121687 -2.693247419315872e9 -122.1 126.08358684506923 -2.6936826761791573e9 -122.105 126.04694782048509 -2.6941179893074865e9 -122.11 126.01027338503152 -2.694553358707379e9 -122.115 125.97356344615227 -2.694988784385359e9 -122.12 125.936817911165 -2.6954242663479586e9 -122.125 125.9000366872568 -2.6958598046017094e9 -122.13 125.86321968147982 -2.6962953991531515e9 -122.135 125.8263668007487 -2.696731050008831e9 -122.14 125.78947795183637 -2.697166757175293e9 -122.145 125.75255304136935 -2.697602520659093e9 -122.15 125.71559197582535 -2.69803834046679e9 -122.155 125.67859466153001 -2.6984742166049457e9 -122.16 125.64156100465166 -2.698910149080128e9 -122.165 125.604490911199 -2.6993461378989124e9 -122.17 125.56738428701763 -2.699782183067872e9 -122.175 125.53024103778573 -2.7002182845935917e9 -122.18 125.49306106901173 -2.7006544424826593e9 -122.185 125.45584428603013 -2.701090656741665e9 -122.19 125.41859059399832 -2.7015269273772063e9 -122.195 125.38129989789363 -2.7019632543958845e9 -122.2 125.34397210250908 -2.702399637804308e9 -122.205 125.30660711245164 -2.702836077609085e9 -122.21000000000001 125.26920483213715 -2.7032725738168344e9 -122.215 125.23176516578879 -2.7037091264341736e9 -122.22 125.1942880174328 -2.7041457354677315e9 -122.225 125.15677329089549 -2.704582400924138e9 -122.23 125.11922088980039 -2.705019122810028e9 -122.235 125.08163071756493 -2.705455901132042e9 -122.24 125.04400267739769 -2.705892735896825e9 -122.245 125.00633667229418 -2.706329627111028e9 -122.25 124.96863260503574 -2.7067665747813044e9 -122.255 124.93089037818457 -2.7072035789143147e9 -122.26 124.8931098940817 -2.707640639516725e9 -122.265 124.85529105484385 -2.7080777565952024e9 -122.27 124.81743376236003 -2.7085149301564226e9 -122.275 124.77953791828958 -2.708952160207067e9 -122.28 124.74160342405831 -2.7093894467538157e9 -122.285 124.70363018085511 -2.709826789803361e9 -122.29 124.66561808963061 -2.710264189362397e9 -122.295 124.62756705109322 -2.710701645437621e9 -122.3 124.58947696570581 -2.7111391580357385e9 -122.305 124.55134773368377 -2.7115767271634593e9 -122.31 124.51317925499208 -2.712014352827495e9 -122.315 124.47497142934154 -2.712452035034566e9 -122.32 124.43672415618676 -2.7128897737913957e9 -122.325 124.39843733472323 -2.713327569104714e9 -122.33 124.3601108638838 -2.7137654209812536e9 -122.33500000000001 124.32174464233678 -2.7142033294277544e9 -122.34 124.28333856848292 -2.714641294450959e9 -122.345 124.24489254045179 -2.715079316057617e9 -122.35 124.20640645609974 -2.7155173942544823e9 -122.355 124.16788021300732 -2.715955529048315e9 -122.36 124.1293137084758 -2.7163937204458776e9 -122.365 124.09070683952493 -2.7168319684539385e9 -122.37 124.05205950288918 -2.7172702730792756e9 -122.375 124.01337159501716 -2.717708634328663e9 -122.38 123.97464301206604 -2.718147052208888e9 -122.385 123.93587364990084 -2.718585526726741e9 -122.39 123.89706340409087 -2.7190240578890133e9 -122.395 123.85821216990723 -2.7194626457025065e9 -122.4 123.8193198423194 -2.7199012901740265e9 -122.405 123.78038631599402 -2.7203399913103795e9 -122.41 123.74141148529043 -2.7207787491183834e9 -122.415 123.70239524425828 -2.7212175636048594e9 -122.42 123.66333748663597 -2.7216564347766285e9 -122.425 123.62423810584671 -2.722095362640525e9 -122.43 123.5850969949961 -2.7225343472033844e9 -122.435 123.54591404686957 -2.722973388472046e9 -122.44 123.5066891539295 -2.723412486453355e9 -122.445 123.46742220831197 -2.7238516411541653e9 -122.45 123.42811310182537 -2.7242908525813327e9 -122.455 123.38876172594584 -2.724730120741719e9 -122.46000000000001 123.3493679718163 -2.725169445642191e9 -122.465 123.30993173024254 -2.7256088272896194e9 -122.47 123.27045289169072 -2.726048265690885e9 -122.475 123.23093134628508 -2.7264877608528686e9 -122.48 123.19136698380382 -2.72692731278246e9 -122.485 123.15175969367861 -2.7273669214865503e9 -122.49 123.11210936498972 -2.72780658697204e9 -122.495 123.07241588646384 -2.728246309245835e9 -122.5 123.03267914647245 -2.7286860883148413e9 -122.505 122.99289903302717 -2.729125924185976e9 -122.51 122.95307543377821 -2.72956581686616e9 -122.515 122.91320823601183 -2.7300057663623166e9 -122.52 122.87329732664624 -2.7304457726813784e9 -122.525 122.83334259222968 -2.730885835830283e9 -122.53 122.79334391893775 -2.731325955815971e9 -122.535 122.75330119257053 -2.7317661326453896e9 -122.54 122.71321429854842 -2.7322063663254943e9 -122.545 122.67308312191221 -2.7326466568632402e9 -122.55 122.6329075473169 -2.7330870042655907e9 -122.555 122.59268745903105 -2.7335274085395203e9 -122.56 122.55242274093388 -2.733967869691999e9 -122.565 122.51211327651073 -2.734408387730009e9 -122.57 122.47175894885211 -2.7348489626605353e9 -122.575 122.4313596406494 -2.7352895944905734e9 -122.58 122.39091523419384 -2.7357302832271147e9 -122.58500000000001 122.35042561137017 -2.7361710288771667e9 -122.59 122.30989065365841 -2.736611831447735e9 -122.595 122.27059002631292 -2.7370526909214535e9 -122.6 122.22996498713661 -2.7374936072575426e9 -122.605 122.19186168546828 -2.7379345804171667e9 -122.61 122.15114543866844 -2.7383756104498234e9 -122.615 122.11038142062742 -2.7388166974381623e9 -122.62 122.0695695010391 -2.7392578413893695e9 -122.625 122.02870954910927 -2.739699042310628e9 -122.63 121.9878014335514 -2.740140300209134e9 -122.635 121.94684502258407 -2.740581615092087e9 -122.64 121.90584018392687 -2.741022986966693e9 -122.645 121.86478678479706 -2.741464415840164e9 -122.65 121.82368469190584 -2.741905901719723e9 -122.655 121.78253377145555 -2.7423474446125917e9 -122.66 121.7413338891358 -2.742789044526004e9 -122.665 121.70008491011927 -2.7432307014671974e9 -122.67 121.65878669905936 -2.7436724154434175e9 -122.675 121.61743912008531 -2.7441141864619155e9 -122.68 121.57604203679962 -2.744556014529951e9 -122.685 121.53459531227432 -2.744997899654785e9 -122.69 121.49309880904647 -2.74543984184369e9 -122.695 121.45155238911529 -2.745881841103945e9 -122.7 121.40995591393859 -2.7463238974428344e9 -122.705 121.36830924442816 -2.746766010867646e9 -122.71000000000001 121.32661224094726 -2.7472081813856807e9 -122.715 121.28486476330569 -2.7476504090042396e9 -122.72 121.2430666707571 -2.7480926937306337e9 -122.725 121.2012178219945 -2.7485350355721827e9 -122.73 121.15931807514612 -2.7489774345362105e9 -122.735 121.11736728777296 -2.7494198906300454e9 -122.74 121.07536531686335 -2.7498624038610277e9 -122.745 121.03331201883 -2.7503049742365003e9 -122.75 120.99120724950632 -2.750747601763816e9 -122.755 120.9490508641413 -2.7511902864503303e9 -122.76 120.90684271739663 -2.7516330283034124e9 -122.765 120.87239230427623 -2.752075827137149e9 -122.77 120.83008922003242 -2.752518682841174e9 -122.775 120.78773357890913 -2.752961595733396e9 -122.78 120.7453252310519 -2.75340456582123e9 -122.785 120.70286402598146 -2.753847593112098e9 -122.79 120.66034981259251 -2.754290677613434e9 -122.795 120.61778243914867 -2.754733819332672e9 -122.8 120.57516175327683 -2.7551770182772584e9 -122.805 120.53248760196465 -2.755620274454646e9 -122.81 120.48975983155532 -2.7560635878722916e9 -122.815 120.44697828774352 -2.756506958537662e9 -122.82 120.40414281557057 -2.756950386458232e9 -122.825 120.36125325942038 -2.7573938716414843e9 -122.83 120.31830946301505 -2.7578374140949044e9 -122.83500000000001 120.27531126941022 -2.7582810138259892e9 -122.84 120.23225852099038 -2.7587246708422403e9 -122.845 120.1891510594646 -2.7591683851511703e9 -122.85 120.14598872586204 -2.7596121567602963e9 -122.855 120.1027713605268 -2.760055985677145e9 -122.86 120.0594988031139 -2.7604998719092455e9 -122.865 120.01617089258421 -2.760943815464143e9 -122.87 119.97458074616347 -2.7613878163469486e9 -122.875 119.73184101023294 -2.7618319188860226e9 -122.88 119.68810287836446 -2.762276048895362e9 -122.885 119.64430879920893 -2.7627202362718415e9 -122.89 119.60045860952054 -2.763164481023012e9 -122.895 119.55655214534103 -2.76360878315644e9 -122.9 119.5125892419962 -2.764053142679695e9 -122.905 119.46856973408998 -2.764497559600353e9 -122.91 119.42449345549885 -2.7649420339259996e9 -122.915 119.3803602393692 -2.7653865656642303e9 -122.92 119.33616991811027 -2.765831154822643e9 -122.925 119.29192232339012 -2.766275801408848e9 -122.93 119.24761728612987 -2.766720505430462e9 -122.935 119.20325463650046 -2.7671652668951063e9 -122.94 119.15883420391518 -2.767610085810415e9 -122.945 119.11435581702605 -2.7680549621840267e9 -122.95 119.06981930371823 -2.768499896023593e9 -122.955 119.02522449110482 -2.7689448873367634e9 -122.96000000000001 118.98057120552173 -2.7693899361312056e9 -122.965 118.93585927252187 -2.769835042414589e9 -122.97 118.89108851687062 -2.7702802061945934e9 -122.975 118.84625876253997 -2.7707254274789076e9 -122.98 118.80136983270317 -2.771170706275226e9 -122.985 118.75642154972945 -2.7716160425912533e9 -122.99 118.71141373517794 -2.7720614364347e9 -122.995 118.66634620979305 -2.7725068878132887e9 -123. 118.62121879349813 -2.772952396734745e9 -123.005 118.5760313053903 -2.773397963206805e9 -123.01 118.53078356373402 -2.7738435872372174e9 -123.015 118.48547538595723 -2.7742892688337307e9 -123.02 118.44010658864288 -2.7747350080041084e9 -123.025 118.3946769875252 -2.775180804756122e9 -123.03 118.34918639748365 -2.7756266590975456e9 -123.035 118.30363463253552 -2.7760725710361676e9 -123.04 118.25802150583186 -2.7765185405797863e9 -123.045 118.21234682965058 -2.7769645677362e9 -123.05 118.16661041539011 -2.777410652513223e9 -123.055 118.12081207356395 -2.777856794918678e9 -123.06 118.07495161379433 -2.778302994960391e9 -123.065 118.02902884480591 -2.778749252646202e9 -123.07 117.98304357441931 -2.7791955679839563e9 -123.075 117.93699560954563 -2.7796419409815135e9 -123.08 117.89088475617979 -2.780088371646731e9 -123.08500000000001 117.84471081939213 -2.7805348599874873e9 -123.09 117.79847360332641 -2.7809814060116606e9 -123.095 117.75217291118885 -2.7814280097271433e9 -123.1 117.70580854524383 -2.781874671141834e9 -123.105 117.65938030680694 -2.7823213902636433e9 -123.11 117.61288799623848 -2.782768167100485e9 -123.115 117.56633141293614 -2.783215001660288e9 -123.12 117.52143410389283 -2.7836618939024377e9 -123.125 117.4752068832732 -2.7841088438075805e9 -123.13 117.43146004054003 -2.784555851216819e9 -123.135 117.38464596510595 -2.7850029163744683e9 -123.14 117.33776373553886 -2.785450039294943e9 -123.145 117.29081312676203 -2.785897219986432e9 -123.15 117.24379391254145 -2.7863444584571366e9 -123.155 117.19670586547575 -2.7867917547152624e9 -123.16 117.14954875698713 -2.7872391087690306e9 -123.165 117.1023223573137 -2.7876865206266713e9 -123.17 117.05502643549964 -2.788133990296424e9 -123.175 117.00766075938687 -2.788581517786541e9 -123.18 116.96022509560612 -2.7890291031052856e9 -123.185 116.91271920956751 -2.789476746260927e9 -123.19 116.89726781335854 -2.789924446561654e9 -123.195 116.86649415884901 -2.7903722021309915e9 -123.2 116.81884266622986 -2.790820015366563e9 -123.205 116.77111643606044 -2.79126788646868e9 -123.21000000000001 116.72331520195888 -2.7917158154459343e9 -123.215 116.6754386960469 -2.7921638023069215e9 -123.22 116.62748664893593 -2.7926118470602546e9 -123.225 116.5794587897162 -2.7930599497145567e9 -123.23 116.53135484594404 -2.793508110278467e9 -123.235 116.48317454362996 -2.793956328760635e9 -123.24 116.43491760722559 -2.794404605169722e9 -123.245 116.38658375961141 -2.7948529395144067e9 -123.25 116.33817272208498 -2.795301331803374e9 -123.255 116.28968421434641 -2.795749782045328e9 -123.26 116.24111795448663 -2.796198290248985e9 -123.265 116.19247365897337 -2.79664685642307e9 -123.27 116.14375104263975 -2.797095480576327e9 -123.275 116.09494981866827 -2.79754416271751e9 -123.28 116.04606969857996 -2.7979929028553867e9 -123.285 115.99711039221874 -2.798441700998741e9 -123.29 115.94807160773874 -2.7988905571563683e9 -123.295 115.8989530515905 -2.7993394713370743e9 -123.3 115.84975442850606 -2.7997884435496845e9 -123.305 115.8004754414851 -2.8002374738030357e9 -123.31 115.75111579178137 -2.800686562105977e9 -123.315 115.70167517888758 -2.8011357084673734e9 -123.32 115.65215330051986 -2.8015849128961034e9 -123.325 115.60254985260524 -2.80203417540106e9 -123.33 115.55286452926408 -2.802483495991148e9 -123.33500000000001 115.5030970227967 -2.8029328746752915e9 -123.34 115.45324702366798 -2.8033823114624224e9 -123.345 115.40331422049137 -2.8038318063614917e9 -123.35 115.35329830001312 -2.804281359381464e9 -123.355 115.3031989470975 -2.804730970531319e9 -123.36 115.25301584471002 -2.8051806398200474e9 -123.365 115.20274867390158 -2.805630367256659e9 -123.37 115.15239711379284 -2.806080152850178e9 -123.375 115.10196084155622 -2.806529996609638e9 -123.38 115.05143953240123 -2.806979898544095e9 -123.385 115.00083285955593 -2.807429858662618e9 -123.39 114.95014049425153 -2.807879876974286e9 -123.395 114.89936210570397 -2.808329953488199e9 -123.4 114.8484973610967 -2.808780088213473e9 -123.405 114.79754592556458 -2.809230281159232e9 -123.41 114.74650746217421 -2.8096805323346243e9 -123.415 114.69538163190695 -2.8101308417488093e9 -123.42 114.6441680936415 -2.81058120941096e9 -123.425 114.5928665041341 -2.811031635330271e9 -123.43 114.54147651800095 -2.811482119515948e9 -123.435 114.48999778769961 -2.811932661977213e9 -123.44 114.43842996350922 -2.8123832627233067e9 -123.445 114.38677269351244 -2.812833921763484e9 -123.45 114.33502562357563 -2.813284639107017e9 -123.455 114.2831883973289 -2.8137354147631927e9 -123.46000000000001 114.23126065614676 -2.8141862487413163e9 -123.465 114.17924203912835 -2.814637141050707e9 -123.47 114.12713218307697 -2.815088091700701e9 -123.475 114.07493072247867 -2.815539100700656e9 -123.48 114.02263728948377 -2.8159901680599403e9 -123.485 113.97025151388378 -2.816441293787942e9 -123.49 113.91777302309174 -2.816892477894065e9 -123.495 113.86520144211914 -2.817343720387734e9 -123.5 113.81253639355677 -2.8177950212783833e9 -123.505 113.75977749755019 -2.8182463805754714e9 -123.51 113.70692437177948 -2.818697798288474e9 -123.515 113.65397663143631 -2.8191492744268785e9 -123.52 113.60093388920086 -2.819600809000195e9 -123.525 113.54779575521881 -2.8200524020179515e9 -123.53 113.49456183707926 -2.8205040534896903e9 -123.535 113.44123173979074 -2.8209557634249725e9 -123.54 113.38780506575647 -2.8214075318333826e9 -123.545 113.33428141475214 -2.8218593587245135e9 -123.55 113.28066038390027 -2.822311244107985e9 -123.555 113.22694156764618 -2.8227631879934335e9 -123.56 113.17312455773306 -2.823215190390509e9 -123.565 113.11920894317751 -2.8236672513088846e9 -123.57 113.06519431024226 -2.824119370758252e9 -123.575 113.01108024241242 -2.8245715487483215e9 -123.58 112.95686632036912 -2.825023785288819e9 -123.58500000000001 112.90255212196132 -2.825476080389494e9 -123.59 112.84813722218159 -2.825928434060112e9 -123.595 112.79362119313787 -2.8263808463104596e9 -123.6 112.73900360402614 -2.8268333171503425e9 -123.605 112.68428402110239 -2.8272858465895867e9 -123.61 112.62946200765654 -2.827738434638035e9 -123.615 112.57453712398186 -2.8281910813055525e9 -123.62 112.51950892734705 -2.828643786602025e9 -123.625 112.46679152851775 -2.829096550480029e9 -123.63 112.41640212825072 -2.8295493728454466e9 -123.635 112.3610699069257 -2.830002253590741e9 -123.64 112.30562773177816 -2.8304551930045023e9 -123.645 112.25007509977395 -2.830908191097049e9 -123.65 112.19441150417668 -2.831361247878728e9 -123.655 112.13863643451181 -2.8318143633598995e9 -123.66 112.08274937652486 -2.8322675375509567e9 -123.665 112.02674981214437 -2.8327207704623127e9 -123.67 111.97063721944299 -2.833174062104404e9 -123.675 111.91441107259614 -2.833627412487692e9 -123.68 111.85807084184184 -2.8340808216226635e9 -123.685 111.80161599344038 -2.8345342895198283e9 -123.69 111.74504598963169 -2.8349878161897197e9 -123.695 111.68836028859425 -2.8354414016428986e9 -123.7 111.63155834440148 -2.83589504588995e9 -123.705 111.57463960697831 -2.8363487489414816e9 -123.71000000000001 111.51760352205854 -2.8368025108081303e9 -123.715 111.46044953113994 -2.837256331500555e9 -123.72 111.4031770714379 -2.8377102110294423e9 -123.725 111.34578557584115 -2.8381641494055033e9 -123.73 111.28827447286442 -2.838618146639478e9 -123.735 111.23064318660329 -2.839072202742129e9 -123.74 111.17289113668465 -2.8395263177242465e9 -123.745 111.11501773821897 -2.8399804915966506e9 -123.75 111.05702240175212 -2.840434724370181e9 -123.755 110.99890453321568 -2.8408890160557113e9 -123.76 110.94066353387501 -2.8413433666641417e9 -123.765 110.88229880028139 -2.841797776206393e9 -123.77 110.82380972421711 -2.842252244693422e9 -123.775 110.765195692645 -2.842706772136209e9 -123.78 110.7064560876549 -2.8431613585457625e9 -123.785 110.64759028641004 -2.8436160039331193e9 -123.79 110.58859766109083 -2.8440707083093486e9 -123.795 110.52947757884206 -2.8445254716855407e9 -123.8 110.47022940171433 -2.84498029407282e9 -123.805 110.41085248660877 -2.845435175482341e9 -123.81 110.35134618521732 -2.845890115925283e9 -123.815 110.29170984396626 -2.846345115412858e9 -123.82 110.23194280395559 -2.8468001739563065e9 -123.825 110.1720444008976 -2.847255291566901e9 -123.83 110.11201396505815 -2.847710468255941e9 -123.83500000000001 110.05185082119202 -2.8481657040347595e9 -123.84 109.99155428848209 -2.8486209989147177e9 -123.845 109.93112368047329 -2.8490763529072094e9 -123.85 109.87055830500925 -2.8495317660236588e9 -123.855 109.8098574641661 -2.8499872382755227e9 -123.86 109.74902045418497 -2.850442769674287e9 -123.865 109.688046565405 -2.8508983602314715e9 -123.87 109.62693508219394 -2.85135400995863e9 -123.875 109.56568528287931 -2.851809718867344e9 -123.88 109.5042964396758 -2.85226548696923e9 -123.885 109.44276781861481 -2.852721314275941e9 -123.89 109.38109867947114 -2.8531772007991543e9 -123.895 109.31928827568811 -2.8536331465505905e9 -123.9 109.2573358543026 -2.8540891515419993e9 -123.905 109.19524065586971 -2.854545215785162e9 -123.91 109.13300191438364 -2.8550013392918987e9 -123.915 109.07061885719985 -2.8554575220740633e9 -123.92 109.00809070495427 -2.8559137641435423e9 -123.925 108.94541667148384 -2.8563700655122576e9 -123.93 108.88259596374117 -2.856826426192169e9 -123.935 108.81962778171413 -2.8572828461952705e9 -123.94 108.75651131833841 -2.8577393255335913e9 -123.945 108.6932457594117 -2.858195864219198e9 -123.95 108.62983028350601 -2.8586524622641945e9 -123.955 108.56626406187961 -2.859109119680718e9 -123.96000000000001 108.50254625838464 -2.859565836480949e9 -123.965 108.43867602937681 -2.860022612677099e9 -123.97 108.37465252362054 -2.8604794482814226e9 -123.975 108.31047488219573 -2.860936343306209e9 -123.98 108.24614223839913 -2.8613932977637906e9 -123.985 108.18165371764925 -2.8618503116665316e9 -123.99 108.11700843738403 -2.86230738502684e9 -123.995 108.0522055069608 -2.862764517857166e9 -124. 107.9872440275546 -2.8632217101699905e9 -124.005 107.92212309205169 -2.863678961977845e9 -124.01 107.85684178494387 -2.864136273293296e9 -124.015 107.79139918222269 -2.86459364412895e9 -124.02 107.72579435126671 -2.8650510744974566e9 -124.025 107.66002635073107 -2.8655085644115105e9 -124.03 107.59409423043523 -2.865966113883841e9 -124.035 107.52799703124634 -2.866423722927225e9 -124.04 107.46173378496289 -2.866881391554484e9 -124.045 107.39530351419484 -2.867339119778474e9 -124.05 107.32870523224341 -2.8677969076121035e9 -124.055 107.261937942976 -2.868254755068321e9 -124.06 107.19500064070436 -2.868712662160119e9 -124.065 107.12789231005304 -2.8691706289005356e9 -124.07 107.06061192583267 -2.8696286553026543e9 -124.075 106.99669696223343 -2.870086741219637e9 -124.08 106.93617734656159 -2.870544886418695e9 -124.08500000000001 106.8683879888928 -2.871003091195138e9 -124.09 106.83783957092857 -2.871461355063794e9 -124.095 106.81872976474 -2.871919676315404e9 -124.1 106.75061281483798 -2.872378056236548e9 -124.105 106.68230775100534 -2.8728364959022436e9 -124.11 106.41441644762352 -2.873295001911248e9 -124.115 106.34519041275976 -2.873753573894313e9 -124.12 106.27577124539464 -2.8742122056918507e9 -124.125 106.20615767108093 -2.874670897318082e9 -124.13 106.13634840171859 -2.875129648787285e9 -124.135 106.06634213534916 -2.875588460113797e9 -124.14 105.99613755595014 -2.876047331312012e9 -124.145 105.92573333322397 -2.876506262396384e9 -124.15 105.85512812238098 -2.876965253381428e9 -124.155 105.7843205639208 -2.877424304281716e9 -124.16 105.71330928340946 -2.8778834151118855e9 -124.165 105.64209289124904 -2.8783425858866343e9 -124.17 105.57066998244731 -2.87880181662072e9 -124.175 105.49903913637783 -2.879261107328965e9 -124.18 105.42719891654127 -2.879720458026258e9 -124.185 105.3551478703159 -2.8801798687275467e9 -124.19 105.28288452870682 -2.8806393394478483e9 -124.195 105.21040740609006 -2.8810988702022443e9 -124.2 105.13771499994932 -2.8815584610058837e9 -124.205 105.06480579060997 -2.8820181118739786e9 -124.21000000000001 104.9916782409648 -2.882477822821816e9 -124.215 104.91833079619933 -2.8829375938647437e9 -124.22 104.84476188350364 -2.8833974250181847e9 -124.225 104.77096991178456 -2.8838573162976313e9 -124.23 104.696953271371 -2.884317267718646e9 -124.235 104.64485181422987 -2.884777278893773e9 -124.24 104.57044611249582 -2.8852373493716245e9 -124.245 104.49580892342213 -2.885697480035001e9 -124.25 104.42093852769248 -2.886157670899868e9 -124.255 104.34583318521572 -2.886617921982274e9 -124.26 104.2704911347782 -2.8870782332983437e9 -124.265 104.19491059368823 -2.887538604864277e9 -124.27 104.11908975740864 -2.887999036696356e9 -124.275 104.04302679918456 -2.8884595288109474e9 -124.28 103.9667198696655 -2.88892008122449e9 -124.285 103.8901670965143 -2.889380693953512e9 -124.29 103.8133665840064 -2.8898413670146265e9 -124.295 103.73631641263118 -2.890302100424524e9 -124.3 103.6590146386677 -2.890762894199984e9 -124.305 103.58145929376464 -2.891223748357876e9 -124.31 103.50364838450471 -2.891684662915149e9 -124.315 103.42557989196001 -2.892145637888849e9 -124.32 103.34725177123666 -2.8926066732961063e9 -124.325 103.26866195101168 -2.8930677691541452e9 -124.33 103.18980833305598 -2.893528925480278e9 -124.33500000000001 103.11068879174772 -2.893990142291914e9 -124.34 103.03130117357635 -2.894451419606553e9 -124.345 102.95164329662919 -2.8949127574417944e9 -124.35 102.87171295007298 -2.895374155815332e9 -124.355 102.7915078936187 -2.895835614744958e9 -124.36 102.71102585697648 -2.896297134248561e9 -124.365 102.63026453929389 -2.8967587143441343e9 -124.37 102.54922160858337 -2.8972203550497723e9 -124.375 102.46789470113754 -2.8976820563836675e9 -124.38 102.3862814209257 -2.8981438183641224e9 -124.385 102.30437933897956 -2.898605641009544e9 -124.39 102.22218599276174 -2.8990675243384447e9 -124.395 102.22625751089328 -2.899529465722157e9 -124.4 102.21554559655434 -2.8999914625957823e9 -124.405 102.13300852027135 -2.900453518366495e9 -124.41 102.05014992537816 -2.9009156348701367e9 -124.415 101.9669667649686 -2.901377812127103e9 -124.42 101.88345594490295 -2.901840050157919e9 -124.425 101.79961432278286 -2.902302348983258e9 -124.43 101.71543870690164 -2.9027647086239347e9 -124.435 101.63092585516492 -2.903227129100907e9 -124.44 101.54607247397945 -2.9036896104352813e9 -124.445 101.46087521710837 -2.904152152648315e9 -124.45 101.375330684501 -2.904614755761416e9 -124.455 101.28943542108037 -2.9050774197961445e9 -124.46000000000001 101.20318591550073 -2.9055401447742224e9 -124.465 101.12209767399553 -2.906002930543769e9 -124.47 101.04623717785245 -2.9064657766266637e9 -124.475 100.95894320755647 -2.906928683554648e9 -124.48 100.87126024169584 -2.9073916515134625e9 -124.485 100.78318401442833 -2.9078546805268884e9 -124.49 100.69471018311629 -2.908317770618906e9 -124.495 100.60583432639243 -2.9087809218136964e9 -124.5 100.51655194216302 -2.9092441341356435e9 -124.505 100.42685844554701 -2.909707407609338e9 -124.51 100.3367491667429 -2.910170742259585e9 -124.515 100.24621934883127 -2.9106341381114016e9 -124.52 100.1552641454967 -2.911097595190025e9 -124.525 100.06387861867894 -2.91156111352092e9 -124.53 99.97205773614165 -2.9120246931297708e9 -124.535 99.87979636895611 -2.9124883340424976e9 -124.54 99.78708928890353 -2.9129520362852616e9 -124.545 99.6939311657815 -2.9134157998844523e9 -124.55 99.60031656461916 -2.9138796248667145e9 -124.555 99.50623994279428 -2.91434351125894e9 -124.56 99.41169564704711 -2.914807459088273e9 -124.565 99.31667791038642 -2.915271468382119e9 -124.57 99.22118084888656 -2.915735539168148e9 -124.575 99.1251984583646 -2.9161996714743004e9 -124.58 99.02872461093867 -2.9166638653287907e9 -124.58500000000001 98.93175305145448 -2.917128120760116e9 -124.59 98.83427739378865 -2.917592437797057e9 -124.595 98.73629111699604 -2.91805681646869e9 -124.6 98.63778756132977 -2.9185212568043876e9 -124.605 98.53875992409603 -2.9189857588338313e9 -124.61 98.43920125535499 -2.9194503225870066e9 -124.615 98.33910445345217 -2.919914948094224e9 -124.62 98.23846226037539 -2.9203796353861146e9 -124.625 98.13726725692909 -2.9208443844936414e9 -124.63 98.03551185771467 -2.9213091954481063e9 -124.635 97.93318830590862 -2.921774068281161e9 -124.64 97.83028866782871 -2.922239003024804e9 -124.645 97.72680482727901 -2.922703999711403e9 -124.65 97.62272847966004 -2.9231690583736925e9 -124.655 97.51805112583058 -2.923634179044784e9 -124.66 97.41276406571568 -2.924099361758179e9 -124.665 97.30685839163928 -2.9245646065477753e9 -124.67 97.20032498137252 -2.925029913447874e9 -124.675 97.09315449087843 -2.9254952824931917e9 -124.68 96.98533734674301 -2.9259607137188725e9 -124.685 96.87686373826871 -2.926426207160492e9 -124.69 96.76772360921551 -2.926891762854075e9 -124.695 96.65790664917222 -2.9273573808361034e9 -124.7 96.54740228453383 -2.9278230611435246e9 -124.705 96.43619966906176 -2.928288803813768e9 -124.71000000000001 96.32428767401022 -2.928754608884755e9 -124.715 96.21165487778708 -2.929220476394911e9 -124.72 96.09828955512398 -2.9296864063831787e9 -124.725 95.98417966572737 -2.9301523988890357e9 -124.73 95.8693128423833 -2.930618453952503e9 -124.735 95.75367637847823 -2.9310845716141605e9 -124.74 95.63725721489887 -2.9315507519151654e9 -124.745 95.52004192628269 -2.9320169948972664e9 -124.75 95.4020167065725 -2.932483300602817e9 -124.755 95.28316735382636 -2.932949669074797e9 -124.76 95.16347925424714 -2.93341610035683e9 -124.765 95.0465425324097 -2.9338825944254603e9 -124.77 94.925157089636 -2.9343491512563105e9 -124.775 94.80288683297474 -2.9348157710308976e9 -124.78 94.7087647447561 -2.935282453252632e9 -124.785 94.58484645019263 -2.9357491974045935e9 -124.79 94.45993440569282 -2.936216004635648e9 -124.795 94.33400812877677 -2.9366828749978385e9 -124.8 94.20704643560092 -2.937149808544153e9 -124.805 94.07902740705005 -2.9376168053285546e9 -124.81 93.94992835270655 -2.938083865406008e9 -124.815 93.82177482694033 -2.9385509888082576e9 -124.82 93.69046169122215 -2.9390181755260396e9 -124.825 93.55799578372942 -2.9394854257073565e9 -124.83 93.42435093238531 -2.9399527394115553e9 -124.83500000000001 93.28949997592991 -2.940420116699191e9 -124.84 93.15341471106228 -2.9408875576320553e9 -124.845 93.01606583588085 -2.94135506227324e9 -124.85 92.87742288933988 -2.941822630687178e9 -124.855 92.7374541863495 -2.9422902629397e9 -124.86 92.59612674814137 -2.942757959098083e9 -124.865 92.45340622746424 -2.943225719231122e9 -124.87 92.3092568281398 -2.943693543409185e9 -124.875 92.16364121845069 -2.944161431704273e9 -124.88 92.01652043776043 -2.9446293841901035e9 -124.885 91.8678537957318 -2.945097400942175e9 -124.89 91.71759876338763 -2.9455654820378466e9 -124.895 91.56571085521773 -2.9460336275564275e9 -124.9 91.41214350139813 -2.9465018375792627e9 -124.905 91.25684790909732 -2.946970112189822e9 -124.91 91.09977291171748 -2.947438451473818e9 -124.915 90.94086480474795 -2.9479068555192957e9 -124.92 90.78006716676553 -2.948375324416759e9 -124.925 90.61732066389557 -2.9488438582592945e9 -124.93 90.45256283583413 -2.949312457142703e9 -124.935 90.28572786126375 -2.9497811211656375e9 -124.94 90.11674630018315 -2.9502498504297657e9 -124.945 89.94554481030951 -2.9507186450399313e9 -124.95 89.77204583431377 -2.951187505104334e9 -124.955 89.59616725411799 -2.9516564307347155e9 -124.96000000000001 89.41782200792325 -2.9521254220465813e9 -124.965 89.23691766495595 -2.9525944791594143e9 -124.97 89.05335595205948 -2.953063602196932e9 -124.975 88.86703222533687 -2.953532791287348e9 -124.98 88.67783487881066 -2.9540020465636663e9 -124.985 88.48564468070985 -2.9544713681639996e9 -124.99 88.29033402624567 -2.954940756231926e9 -124.995 88.09176609368689 -2.955410210916869e9 -125. 87.88979388798721 -2.9558797323745217e9 -125.005 87.71795693045247 -2.9563493203609495e9 -125.01 87.53696554066785 -2.956818972743965e9 -125.015 87.3244903524204 -2.957288692280645e9 -125.02 87.10760261105 -2.9577584792642674e9 -125.025 86.8860492836132 -2.9582283339065e9 -125.03 86.65955243964244 -2.958698256430865e9 -125.035 86.42780568988181 -2.959168247073925e9 -125.04 86.19046994278771 -2.95963830608664e9 -125.045 85.9471683119964 -2.9601084337359204e9 -125.05 85.69747995751683 -2.960578630306447e9 -125.055 85.44093257454479 -2.9610488961027765e9 -125.06 85.17699314840137 -2.9615192314518175e9 -125.065 85.01036674517607 -2.9619896357026787e9 -125.07 84.77753118741313 -2.9624601040539274e9 -125.075 84.49241504545506 -2.9629306427169075e9 -125.08 84.19720669680297 -2.9634012523010197e9 -125.08500000000001 83.93037055719948 -2.9638719331654882e9 -125.09 83.9337254906679 -2.9643426761850524e9 -125.095 83.93708042413456 -2.964813475450286e9 -125.1 83.94043535760244 -2.9652843309656744e9 \ No newline at end of file diff --git a/Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy b/Models/InertDoubletModelApplicationsPaper/scanResults/BM1_05v_top.npy deleted file mode 100644 index a3ddba06732ef7882b42579a1da047fa7032b6f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3623 zcmbu>X?zq#8VBGB;Rqv#N;nJ(;c^lTfh0td2oxcN267N9i3TrrjwU@Y%*P(+h+I(C3f$0A92Zic%t1CklA=ZvHNA# zPsm70Op33H|9?K#$D*Cy;B5cgWT%hF$+LqV>b4VNpKF~?WT(#?pd{#|R5-w0rEt3OyA48E0fb zEPuwH7f|h?io#UVceKbdyX0 zL5>O&Fyt!N6P(C_B@B}c;K|_xr|<;xFyxyjSilop>!V}vm>mcTDNGd;ED9xfFE4;G z6dMIflzcJ4QVRE(BzV7K#$KkMrsJ3gEbcY+2&Sp<0EP!m*dNkY9-rTG@KC=?W8q;H z9>FkOVE;n|yPdH+M0TfylyfJy4*g0I*j*AjQ`)*AZo;e(yDXt&N7HKePo5LOK0`0x zuXjz6dz~Laxe5vfcbI)9SDA&uW2npyvwJza4};&F9XNZ@cizsvg)ImOg@DLTL+n9b zpaMgsQDBbZ7un}h_@fE?qo(Zh^wa!Oo4NmqQBNVLQei%Z1t#o|=_|`VJu+@}V>E(= zDlEcKEwDcx!Cu4IRgt|`LY^m=I=xr73G8(eI@@k#-RMA%5PQ9Zj*pyHm42-*f_<@G ze%Suq*79N>f+tj1g5k+9`%GIo6EE-#hSf%aHA;iX{w#&HChY4>+5fDc=JHRYeX*&H2-d6c9EQJ`uy4>;HeE`r zZaUK)!SgD-fMKJ+{$d3CON{+xk^L13`7;-9JmwlMuy11Qlh6OSH|>0g{Z$E_P|}Nw znx{vwZ`RAVF70^Xp6wn4uc^?C;q@^48(d`zhBpnBtzq`JIQupX+s)ZqID6{RDKTpv z+=}3B3h#*QJ3{O`d4XLRb{hrWRkn-ldnoKRVSmq*y;VO=U4~`L@YAai>{H==41YCY z->{;?->4J6ga1}iR|Yo{L_T}U#9F|>ZghQHa(}OZ9Reu zDtv|EYZLZ=>nq1rPq}F z`>&W-*u~IPoXyte_7u53sp-B^oBch=sR z6uJ5OuKp{E%P+PiB65qi>sD=7559|Ef3=GciRE2>qc!eAq$e8)R*_!pONfv3W_<}& zs5?s=K4}goNcw2wXRo~O$trLgA(Gp)!L|j``#F=B5>p<=`jjNI)+FWOY}hpA z5qv^R`Ou_&`%2$`5s?%&q>@zDVv@#MlaxnZ-_`a-^N>BQDTt(NyYAL@jpDn)DQEDm Qm~ti?2+EXXv2RE6Z{t3cX8-^I diff --git a/Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy b/Models/InertDoubletModelApplicationsPaper/scanResults/BM3_05v_top.npy deleted file mode 100644 index f1837d97f9bcbf5f9da972a43e69389acae725eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5081 zcmbuCd0Z4n7Jxw%aMVP_3lk9}3SK05pHvKBiy&f&iU*ou7#R?OSJML?fJUVem6+g# z7x9YG&8~??BZ?S|#<* zS{K}--3p*VxO)HNCTxb#-8$0q3{82+Rk)df)Q6e-8&VyHi6B^+fV|tdw2(L;c&ZqiN;{Nt(F*_$F zJ`$Qs$&uTKJ8<_!oEZP~T z4}ezujIAlOah!1ov~@kBn+)xe!o3R)r?l!$tOR@&Xiwoa^?_pGb&H!t<HgLXcxXFdxvB zLO1(>?v_B@hfl5kKo1#uCM7h*#G09IlT$M@;?V|#n38O%C^*AvNHNPsS;ohI(=@@D zo-SpEFtZiqTMdz8g)IhnOZ}LL$l)==BswfUYIH1wD$t8U?}TRf`RS<{;Ve})Gn^3$ zeJnnfHsRiW6RSRJes4U1z6$iC(Ep{CyDu_z(t8(+$KkI}iUJl2sZQ)^oXQLe>2@kJo!B!t_Dl*{`q+VEAJXBI z>hW<^1egp~5xeZbZsP;8DdgA(%(7&O*k{WyM+f^{UF^Bq)0|I?_3pean?Rld`4r~q zV4tt8j0+v|w6<||7`&&z0tyQS?2BBm7a(>;#9k*;R8FB51rUcIQA73R_bG4 z#j$t3xuc-XjY|b*1`ze&`V?V&L=jL8{5;3oWz(E-*MC^wg*em&f!xX-<52&(~i`b9I@U;&1qq^9S zX-{))ZpVXJdlUlSC~%y@w>sEQXe%op9Fus@MVU7)8SPU`2t{;NbTOr2CwySyY2~t>N%<+8)X=5+KTBy5Ps=IvnF8=zfz6h~aJmqh+ z_IDxH8Vj~O)&?(vKGqgl}}dvdf!L% z$l7B^d!)82<_wCxK7+8=u%xipF;donw;iuZ%#UZtxTD(h$7p99z#EPiYt{)fRLla^ zWpAjUZ5;Tsq>n)h!6? ztM2Nj?&{BXIV}(1sc3m17SQq_yoi}FYlqaHPf+dB$jghipyj^ek9iAcMaJ3hK(at!MH|i}9$BbK+ z)MX>oWqOvQu){68H7Shh*KsdlBe5W}XkHd9$6)TTJc{4r31aa|*=UUR6U5W10W!r|pV}h#K_sKwrY} zzj@p>N!>M>?{Zq6!c)<5A{Nl{RJ@3mr(rIUtgEFB?ky=1EWfMP>&ox$oYXweVcDn_ zFL(86*?X43<##y=JKEu%4wgvUZmEQsu%xhLjFg#qyWaA2o+0BDwP(R-XPn9#^_J5x z>k20upqNcUKT88VeYUD{2ouh@Jg8#qx}Rj-lp+U zqGcQAGRwxOV>t)Qx|V10hHBZ={#o^@)0+sJjU|Q6!ARL$j5?Nc>vsjNIa+wSG=Q)? zbyvQ+YaZX_v^<}uqUHCnfR-2FMYOySbBVCSC5@-es1z(OQtNfs4<`FewKyynsKv_< z4u7|(%|I8+3U;(ddeN$H?ValBgcV{*VT&a%&mY47h8820P%P`s*7xPBF<@Yh; zmY1u`K2VqGS^f|^-137KsXJ4a?Ix@Q3o={5%Yx;Vm^&=5;`exh)p(_B4MzJ3O7S+0 zj}k4f#aw3VFzQ%dk7ZrU8+b#t9O<=pz|GrR3EPMzg_U8X>?4dimN(V!>K{jax3vr= fY_qy+i@Iwo-{rKtji;jJkFj7g%WOMdlS2LrE8QDD From 138eb217d35796c6c42b16652f00c9d484864e33 Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Wed, 20 Aug 2025 10:02:26 +0100 Subject: [PATCH 15/24] Merge pull request #28 from Wall-Go/FixLoggingPrints Truncation update, and printing fixes --- .../inertDoubletModelConfig.ini | 3 + Models/ManySinglets/manySingletsConfig.ini | 3 + Models/StandardModel/standardModel.py | 4 +- Models/StandardModel/standardModelConfig.ini | 5 +- src/WallGo/__init__.py | 2 +- src/WallGo/boltzmann.py | 162 +++++++++--------- src/WallGo/equationOfMotion.py | 73 ++++++-- src/WallGo/interpolatableFunction.py | 7 +- src/WallGo/polynomial.py | 88 ++++++++++ src/WallGo/results.py | 12 ++ tests/test_Boltzmann.py | 4 +- 11 files changed, 253 insertions(+), 110 deletions(-) diff --git a/Models/InertDoubletModel/inertDoubletModelConfig.ini b/Models/InertDoubletModel/inertDoubletModelConfig.ini index 6d1cc286..f517ef40 100644 --- a/Models/InertDoubletModel/inertDoubletModelConfig.ini +++ b/Models/InertDoubletModel/inertDoubletModelConfig.ini @@ -99,3 +99,6 @@ basisM = Cardinal # The momentum polynomial basis type, either Cardinal or Chebyshev. basisN = Chebyshev + +# Whether or not to truncate the spectral expansion +truncationOption = AUTO \ No newline at end of file diff --git a/Models/ManySinglets/manySingletsConfig.ini b/Models/ManySinglets/manySingletsConfig.ini index d4acd53b..4a87096d 100644 --- a/Models/ManySinglets/manySingletsConfig.ini +++ b/Models/ManySinglets/manySingletsConfig.ini @@ -99,3 +99,6 @@ basisM = Cardinal # The momentum polynomial basis type, either Cardinal or Chebyshev. basisN = Chebyshev + +# Whether or not to truncate the spectral expansion +truncationOption = AUTO \ No newline at end of file diff --git a/Models/StandardModel/standardModel.py b/Models/StandardModel/standardModel.py index 83eb0b71..293561a8 100644 --- a/Models/StandardModel/standardModel.py +++ b/Models/StandardModel/standardModel.py @@ -554,8 +554,8 @@ def getBenchmarkPoints(self) -> list[ExampleInputPoint]: WallGo.WallSolverSettings( # we actually do both cases in the common example bIncludeOffEquilibrium=True, - meanFreePathScale=100.0, # In units of 1/Tnucl - wallThicknessGuess=20.0, # In units of 1/Tnucl + meanFreePathScale=50.0, # In units of 1/Tnucl + wallThicknessGuess=5.0, # In units of 1/Tnucl ), ) ) diff --git a/Models/StandardModel/standardModelConfig.ini b/Models/StandardModel/standardModelConfig.ini index 33c3be7c..c129f3b6 100644 --- a/Models/StandardModel/standardModelConfig.ini +++ b/Models/StandardModel/standardModelConfig.ini @@ -16,7 +16,7 @@ momentumGridSize = 11 ratioPointsWall = 0.5 # Smoothing factor of the mapping function (the larger the smoother) -smoothing = 0.1 +smoothing = 0.3 [EquationOfMotion] # The absolute error tolerance for the wall-velocity result @@ -99,3 +99,6 @@ basisM = Cardinal # The momentum polynomial basis type, either Cardinal or Chebyshev. basisN = Chebyshev + +# Whether or not to truncate the spectral expansion +truncationOption = AUTO diff --git a/src/WallGo/__init__.py b/src/WallGo/__init__.py index 7c580fc7..5b54a534 100644 --- a/src/WallGo/__init__.py +++ b/src/WallGo/__init__.py @@ -21,7 +21,7 @@ from .interpolatableFunction import InterpolatableFunction, EExtrapolationType from .manager import WallGoManager, WallSolverSettings from .particle import Particle -from .polynomial import Polynomial +from .polynomial import Polynomial, SpectralConvergenceInfo from .thermodynamics import Thermodynamics from .equationOfMotion import EOM from .results import WallGoResults diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index f1899052..5c7a62d0 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -11,7 +11,7 @@ import findiff # finite difference methods from .containers import BoltzmannBackground, BoltzmannDeltas from .grid import Grid -from .polynomial import Polynomial +from .polynomial import Polynomial, SpectralConvergenceInfo from .particle import Particle from .collisionArray import CollisionArray from .results import BoltzmannResults @@ -164,12 +164,17 @@ def getDeltas( deltaF = self.solveBoltzmannEquations() # checking spectral convergence - deltaF, shapeTruncated = self.checkSpectralConvergence(deltaF) + deltaF, shapeTruncated, spectralPeaks = self.checkSpectralConvergence(deltaF) # getting (optimistic) estimate of truncation error truncationError = self.estimateTruncationError( deltaF, shapeTruncated ) + truncatedTail = ( + shapeTruncated[1] != deltaF.shape[1], + shapeTruncated[2] != deltaF.shape[2], + shapeTruncated[3] != deltaF.shape[3], + ) particles = self.offEqParticles @@ -228,6 +233,8 @@ def getDeltas( deltaF=deltaF, Deltas=Deltas, truncationError=truncationError, + truncatedTail=truncatedTail, + spectralPeaks=spectralPeaks, ) def solveBoltzmannEquations(self) -> np.ndarray: @@ -343,10 +350,12 @@ def estimateTruncationError(self, deltaF: np.ndarray, shapeTruncated: tuple[int, np.max(truncationErrorPp), ) - def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tuple[int, ...]]: + def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tuple[int, int, int, int], tuple[int, int, int]]: """ - Check for spectral convergence. Tests if last points - in spectral sum are small compared to the 2/3rd points. + Check for spectral convergence. + + Fits to the exponential slope of the last 1/3 of coefficients in the + Chebyshev basis. Also returns the Parameters ---------- @@ -358,17 +367,11 @@ def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tupl ------- deltaFTruncated : np.ndarray Potentially truncated version of input :py:data:`deltaF`, padded with zeros if truncated, so same shape as input. - shapeTruncated : tuple + shapeTruncated : tuple[int, int, int, int] Shape of truncated array. + spectralPeaks : tuple[int, int, int] + Indices of the peaks in the (potentially truncated) spectral expansion. """ - if self.grid.M < 7 or self.grid.N < 7: - logging.warning(f"Cannot check spectral convergence with N, M < 7.") - return deltaF, deltaF.shape - elif self.grid.M < 13 or self.grid.N < 13: - strict = False - else: - strict = True - # constructing Polynomial basisTypes = ("Array", self.basisM, self.basisN, self.basisN) basisNames = ("Array", "z", "pz", "pp") @@ -396,80 +399,47 @@ def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tupl cutSpatial = -((self.grid.M - 1) // 3) cutMomentum = -((self.grid.N - 1) // 3) - # fit slope to the log of the last 1/3rd of the coefficients - if strict: - # enough points to fit slopes with errors - fitChi = np.polyfit( - np.arange(abs(cutSpatial)), - np.log(spectralCoeffsChi[cutSpatial:]), - 1, - cov=True, - ) - fitPz = np.polyfit( - np.arange(abs(cutMomentum)), - np.log(spectralCoeffsPz[cutMomentum:]), - 1, - cov=True, - ) - fitPp = np.polyfit( - np.arange(abs(cutMomentum)), - np.log(spectralCoeffsPp[cutMomentum:]), - 1, - cov=True, - ) - chiConverging = fitChi[0][0] < - np.sqrt(fitChi[1][0, 0]) - pzConverging = fitPz[0][0] < - np.sqrt(fitPz[1][0, 0]) - ppConverging = fitPp[0][0] < - np.sqrt(fitPp[1][0, 0]) - logging.debug( - f"Spectral convergence: n_chi^({fitChi[0][0]:.2g}+/-{np.sqrt(fitChi[1][0, 0]):.2g}), n_pz^({fitPz[0][0]:.2g}+/-{np.sqrt(fitPz[1][0, 0]):.2g}), n_pp^({fitPp[0][0]:.2g}+/-{np.sqrt(fitPp[1][0, 0]):.2g})" - ) - else: - # not enough points to get sensible errors - fitChi = np.polyfit( - np.arange(abs(cutSpatial)), - np.log(spectralCoeffsChi[cutSpatial:]), - 1, - cov=False, - ) - fitPz = np.polyfit( - np.arange(abs(cutMomentum)), - np.log(spectralCoeffsPz[cutMomentum:]), - 1, - cov=False, - ) - fitPp = np.polyfit( - np.arange(abs(cutMomentum)), - np.log(spectralCoeffsPp[cutMomentum:]), - 1, - cov=False, - ) - chiConverging = fitChi[0] < 0 - pzConverging = fitPz[0] < 0 - ppConverging = fitPp[0] < 0 - logging.debug( - f"Spectral convergence: n_chi^({fitChi[0]:.2g}), n_pz^({fitPz[0]:.2g}), n_pp^({fitPp[0]:.2g})" - ) + # checking spectral convergence of spatial direction + chiConvergenceTailInfo = SpectralConvergenceInfo( + spectralCoeffsChi[cutSpatial:], + # weightPower=0, + offset=self.grid.M - 1 + cutSpatial, + ) + # checking spectral convergence of pz direction + pzConvergenceTailInfo = SpectralConvergenceInfo( + spectralCoeffsPz[cutMomentum:], + # weightPower=1, # removed as max(pz) only grows as log(N) + offset=self.grid.N - 1 + cutMomentum, + ) + + # checking spectral convergence of pp direction + ppConvergenceTailInfo = SpectralConvergenceInfo( + spectralCoeffsPp[cutMomentum:], + # weightPower=2, # removed as max(pp) only grows as log(N) + offset=self.grid.N - 1 + cutMomentum, + ) + + allTailsConverging = ( + chiConvergenceTailInfo.apparentConvergence and + pzConvergenceTailInfo.apparentConvergence and + ppConvergenceTailInfo.apparentConvergence + ) # Deciding what to do based on truncationOption if self.truncationOption == ETruncationOption.AUTO: # if the slope is not definitely negative, we will truncate - if not chiConverging: - # logging.debug("Truncating last 1/3 of spectral coefficients in chi direction") + if not chiConvergenceTailInfo.apparentConvergence: deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 truncatedShape[1] = deltaF.shape[1] + cutSpatial - if not pzConverging: - # logging.debug("Truncating last 1/3 of spectral coefficients in pz direction") + if not pzConvergenceTailInfo.apparentConvergence: deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 truncatedShape[2] = deltaF.shape[2] + cutMomentum - if not ppConverging: - # logging.debug("Truncating last 1/3 of spectral coefficients in pp direction") + if not ppConvergenceTailInfo.apparentConvergence: deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 truncatedShape[3] = deltaF.shape[3] + cutMomentum - # if truncatedShape == list(deltaF.shape): - # logging.debug("Spectral expansion converging, so not truncating") elif self.truncationOption == ETruncationOption.THIRD: - # logging.debug("Truncating last 1/3 of spectral coefficients in all directions") + # truncating regardless deltaFPoly.coefficients[:, cutSpatial:, :, :] = 0 deltaFPoly.coefficients[:, :, cutMomentum:, :] = 0 deltaFPoly.coefficients[:, :, :, cutMomentum:] = 0 @@ -478,22 +448,46 @@ def checkSpectralConvergence(self, deltaF: np.ndarray) -> tuple[np.ndarray, tupl deltaF.shape[2] + cutMomentum, deltaF.shape[3] + cutMomentum, ] - if chiConverging and pzConverging and ppConverging: + if allTailsConverging: logging.info( - "Spectral expansions converging but truncated, consider changing truncation option" + "Tails of spectral expansions converging but truncated, consider changing truncation option." ) else: - # logging.debug("Not truncating") - if not chiConverging or not pzConverging or not ppConverging: + # not truncating regardless + if not allTailsConverging: logging.info( - "Spectral expansions not converging, consider changing truncation option, or changing grid parameters" + "Tails of spectral expansions not converging, consider changing truncation option, or changing grid parameters." ) - return deltaF, deltaF.shape + + # checking spectral convergence of z direction + chiConvergenceInfo = SpectralConvergenceInfo( + spectralCoeffsChi[:truncatedShape[1]], weightPower=0 + ) + + # checking spectral convergence of pz direction + pzConvergenceInfo = SpectralConvergenceInfo( + spectralCoeffsPz[:truncatedShape[2]], weightPower=1 + ) + + # checking spectral convergence of pp direction + ppConvergenceInfo = SpectralConvergenceInfo( + spectralCoeffsPp[:truncatedShape[3]], weightPower=2 + ) + + # putting together the spectral peaks + spectralPeaks = ( + chiConvergenceInfo.spectralPeak, + pzConvergenceInfo.spectralPeak, + ppConvergenceInfo.spectralPeak, + ) + + if self.truncationOption == ETruncationOption.NONE: + return deltaF, tuple(truncatedShape), spectralPeaks # changing back to original basis deltaFPoly.changeBasis(basisTypes) - return deltaFPoly.coefficients, tuple(truncatedShape) + return deltaFPoly.coefficients, tuple(truncatedShape), spectralPeaks @staticmethod def _smoothTruncation(length: int, cut: int, sharp: float = 3) -> np.ndarray: @@ -846,7 +840,7 @@ def loadCollisions(self, directoryPath: "pathlib.Path") -> None: self.basisN, self.offEqParticles, ) - logging.debug(f"Loaded collision data from directory {directoryPath}") + logging.debug("Loaded collision data from directory %s", directoryPath) except CollisionLoadError as e: raise diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 13d357b9..dcf5bd47 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -823,9 +823,9 @@ def wallPressure( self.successWallPressure = True - improveConvergence = self.forceImproveConvergence + cautious = self.forceImproveConvergence if wallVelocity > self.hydrodynamics.vJ: - improveConvergence = True + cautious = True logging.info(f"------------- Trying {wallVelocity=:g} -------------") @@ -857,6 +857,8 @@ def wallPressure( deltaF=deltaF, Deltas=offEquilDeltas, truncationError=0.0, + truncatedTail=(False,False,False), + spectralPeaks=(0,0,0), ) else: boltzmannResults = boltzmannResultsInput @@ -935,14 +937,32 @@ def wallPressure( i = 0 if self.includeOffEq: logging.debug( - f"{'pressure':>12s} {'error':>12s} {'errorSolver':>12s} {'errTol':>12s} {'cautious':>12s} {'multiplier':>12s} {'EMViolation before (T30)':>20s} {'EMViolation after (T30)':>20s}" + "%12s %12s %12s %12s %12s %12s %12s %12s %12s %12s", + 'pressure', + 'error', + 'errorSolver', + 'errTol', + 'cautious', + 'multiplier', + 'dT30Before', + 'dT30After', + 'spectralPeak', + 'truncatedTail', ) else: logging.debug( - f"{'pressure':>12s} {'error':>12s} {'errorSolver':>12s} {'errTol':>12s} {'cautious':>12s} {'multiplier':>12s} {'EMViolation (T30)':>20s}" + "%12s %12s %12s %12s %12s %12s %12s", + 'pressure', + 'error', + 'errorSolver', + 'errTol', + 'cautious', + 'multiplier', + 'dT30Before', ) + while True: - if improveConvergence: + if cautious: # Use the improved algorithm (which converges better but slowly) ( pressure, @@ -997,15 +1017,32 @@ def wallPressure( if self.includeOffEq: logging.debug( - f"{pressure:>12g} {error:>12g} {errorSolver:>12g} {errTol:>12g} {improveConvergence:>12} {multiplier:>12g} {EMviolationBefore[0]:>20g} {EMviolationAfter[0]:>20g}" + "%12g %12g %12g %12g %12r %12g %12g %12g %12r %12r", + pressure, + error, + errorSolver, + errTol, + int(cautious), + multiplier, + EMviolationBefore[0], + EMviolationAfter[0], + tuple(int(s) for s in boltzmannResults.spectralPeaks), + tuple(int(t) for t in boltzmannResults.truncatedTail), ) else: logging.debug( - f"{pressure:>12g} {error:>12g} {errorSolver:>12g} {errTol:>12g} {improveConvergence:>12} {multiplier:>12g} {EMviolationBefore[0]:>20g}" - ) + "%12g %12g %12g %12g %12r %12g %12g", + pressure, + error, + errorSolver, + errTol, + int(cautious), + multiplier, + EMviolationBefore[0], + ) i += 1 - if error < errTol or (errorSolver < errTol and improveConvergence): + if error < errTol or (errorSolver < errTol and cautious): """ Even if two consecutive call to _getNextPressure() give similar pressures, it is possible that the internal calls made to @@ -1042,7 +1079,7 @@ def wallPressure( if len(pressures) > 2: if error > abs(pressures[-2] - pressures[-3]) / 1.5: # If the error decreases too slowly, use the improved algorithm - improveConvergence = True + cautious = True logging.info(f"Final {pressure=:g}") logging.debug(f"Final {wallParams=}") @@ -1083,7 +1120,7 @@ def _getNextPressure( Boltzmann results each time. If the iterations overshot the true solution (the two pressure updates go in opposite directions), uses linear interpolation to find a better estimate of the true solution. This function is - called only when improveConvergence=True in wallPressure(). + called only when cautious=True in wallPressure(). """ ( pressure2, @@ -1503,13 +1540,13 @@ def action( return float(U + K) def estimateTanhError( - self, - wallParams: WallParams, - boltzmannResults: BoltzmannResults, - boltzmannBackground: BoltzmannBackground, - hydroResults: HydroResults, - ) -> np.ndarray: - """ + self, + wallParams: WallParams, + boltzmannResults: BoltzmannResults, + boltzmannBackground: BoltzmannBackground, + hydroResults: HydroResults, + ) -> np.ndarray: + r""" Estimates the EOM error due to the tanh ansatz. It is estimated by the integral .. math:: \sqrt{\Delta[\mathrm{EOM}^2]/|\mathrm{EOM}^2|}, diff --git a/src/WallGo/interpolatableFunction.py b/src/WallGo/interpolatableFunction.py index 3675250f..cc7367c0 100644 --- a/src/WallGo/interpolatableFunction.py +++ b/src/WallGo/interpolatableFunction.py @@ -788,8 +788,11 @@ def readInterpolationTable(self, fileToRead: str) -> None: self._validateInterpolationTable((self._rangeMax - self._rangeMin) / 2.55) logging.debug( - f"{selfName}: Succesfully read interpolation table from file. " - "Range [{self._rangeMin}, {self._rangeMax}]" + "%s: Succesfully read interpolation table from file. " + "Range [%g, %g]", + selfName, + self._rangeMin, + self._rangeMax, ) except IOError as ioError: diff --git a/src/WallGo/polynomial.py b/src/WallGo/polynomial.py index fa645c2e..c1c51272 100644 --- a/src/WallGo/polynomial.py +++ b/src/WallGo/polynomial.py @@ -4,6 +4,7 @@ from __future__ import annotations import typing +import logging import numpy as np import numpy.typing as npt from scipy.special import eval_chebyt, eval_chebyu @@ -947,3 +948,90 @@ def _isBroadcastable(self, array1: np.ndarray, array2: np.ndarray) -> bool: else: return False return True + + +class SpectralConvergenceInfo: + """ + Carries information about the convergence of a polynomial expansion. + + Assumes input is a 1d array of coefficients in the Chebyshev basis. Fits a slope to the logarithm of the absolute value of these coefficients. Also, finds the average value of the index, treating the coefficients as a + histogram. + """ + coefficients: np.ndarray + """Coefficients of expansion in the Chebyshev basis, must be 1d.""" + + weightPower: int = 0 + r"""Additional powers of :math:`n` to weight by in assessing convergence. + Default is zero.""" + + offset: int = 0 + r"""Offest in :math:`n`. Default is zero.""" + + apparentConvergence: bool = False + """True if spectral expansion appears to be converging, False otherwise.""" + + spectralPeak: int = 0 + """Positions of the peak of the spectral expansion.""" + + spectralExponent: float = 0.0 + r"""Exponent :math:`\sigma` of :math:`A e^{\sigma n}` fit to spectral expansion.""" + + def __init__( + self, coefficients: np.ndarray, weightPower: int=0, offset: int=0 + ) -> None: + """Initialise given an array.""" + assert len(coefficients.shape) == 1, "SpectralConvergenceInfo requires a 1d array" + self.coefficients = coefficients[:] + self.weightPower = weightPower + self.offset = offset + self._checkSpectralConvergence() + + def _checkSpectralConvergence(self) -> None: + """ + Check for spectral convergence, performing fits and looking at the + position of the maximum. + """ + nCoeff = len(self.coefficients) + weight = (1 + self.offset + np.arange(nCoeff)) ** self.weightPower + absCoefficients = abs(self.coefficients) + if nCoeff < 2: + logging.warning("Spectral convergence tests not valid for n < 2.") + return + if nCoeff < 3: + strict = False + else: + strict = True + + # fit slope to the log of the coefficients + if strict: + # enough points to fit slopes with errors + fit = np.polyfit( + np.arange(nCoeff) + self.offset, + np.log(absCoefficients), + # np.log(absCoefficients * weight), + 1, + cov=True, + ) + self.spectralExponent = fit[0][0] + # self.apparentConvergence = fit[0][0] < - np.sqrt(fit[1][0, 0]) + self.apparentConvergence = fit[0][0] < 0 + else: + # not enough points to get sensible errors + fit = np.polyfit( + np.arange(nCoeff) + self.offset, + np.log(absCoefficients), + # np.log(absCoefficients * weight), + 1, + cov=False, + ) + self.spectralExponent = fit[0] + self.apparentConvergence = fit[0] < 0 + + # Index weighted by absolute value in array + self.spectralPeak = int( + np.sum((np.arange(nCoeff) + self.offset) * weight * absCoefficients) / np.sum(absCoefficients * weight) + ) + + # Alternative convergence condition + # self.apparentConvergence = self.spectralPeak < self.offset + nCoeff // 2 + \ No newline at end of file diff --git a/src/WallGo/results.py b/src/WallGo/results.py index 8b5935f8..51adfc97 100644 --- a/src/WallGo/results.py +++ b/src/WallGo/results.py @@ -28,6 +28,12 @@ class BoltzmannResults: r"""Estimated relative error in :math:`\delta f` due to truncation of spectral expansion.""" + truncatedTail: tuple[bool, bool, bool] + """True if tail 1/3 of spectral expansion was truncated in each direction, False otherwise.""" + + spectralPeaks: tuple[int, int, int] + r"""Indices of the peaks in the spectral expansion in each direction.""" + # These two criteria are to evaluate the validity of the linearization of the # Boltzmann equation. The arrays contain one element for each out-of-equilibrium # particle. To be valid, at least one criterion must be small for each particle. @@ -45,6 +51,8 @@ def __mul__(self, number: float) -> "BoltzmannResults": deltaF=number * self.deltaF, Deltas=number * self.Deltas, truncationError=abs(number) * self.truncationError, + truncatedTail=self.truncatedTail, + spectralPeaks=self.spectralPeaks, linearizationCriterion1=abs(number) * self.linearizationCriterion1, linearizationCriterion2=self.linearizationCriterion2, ) @@ -54,6 +62,8 @@ def __rmul__(self, number: float) -> "BoltzmannResults": deltaF=number * self.deltaF, Deltas=number * self.Deltas, truncationError=abs(number) * self.truncationError, + truncatedTail=self.truncatedTail, + spectralPeaks=self.spectralPeaks, linearizationCriterion1=abs(number) * self.linearizationCriterion1, linearizationCriterion2=self.linearizationCriterion2, ) @@ -63,6 +73,8 @@ def __add__(self, other: "BoltzmannResults") -> "BoltzmannResults": deltaF=other.deltaF + self.deltaF, Deltas=other.Deltas + self.Deltas, truncationError=other.truncationError + self.truncationError, + truncatedTail=self.truncatedTail, + spectralPeaks=self.spectralPeaks, linearizationCriterion1=other.linearizationCriterion1 + self.linearizationCriterion1, linearizationCriterion2=other.linearizationCriterion2 diff --git a/tests/test_Boltzmann.py b/tests/test_Boltzmann.py index f761a3b4..62a96bb1 100644 --- a/tests/test_Boltzmann.py +++ b/tests/test_Boltzmann.py @@ -153,11 +153,11 @@ def test_checkSpectralConvergence( for z in range(spatialGridSize - 1): for pz in range(momentumGridSize - 1): for pp in range(momentumGridSize - 1): - deltaF[0, z, pz, pp] = np.exp(slope*z -1e-2*pz - 1e-2*pp) + deltaF[0, z, pz, pp] = np.exp(slope*z - 1e-2*pz - 1e-3*pp) / (1 + pz) / (1 + pp)**2 # checking spectral convergence - deltaFTruncated, truncatedShape = boltzmann.checkSpectralConvergence(deltaF) + deltaFTruncated, truncatedShape, _ = boltzmann.checkSpectralConvergence(deltaF) nTruncated = (spatialGridSize - 1) // 3 expectTruncated = deltaFTruncated[:, -nTruncated:, :, :] From f63b2ea2d56178607ddf5023e7b1ef7aacafa5ab Mon Sep 17 00:00:00 2001 From: Jorinde van de Vis Date: Wed, 20 Aug 2025 18:44:10 +0200 Subject: [PATCH 16/24] Changed comment about default truncation option in boltzmann.py --- src/WallGo/boltzmann.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index 5c7a62d0..03c5d5bd 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -80,7 +80,7 @@ def __init__( Default is 1.0. truncationOption : ETruncationOption, optional Option for truncating the spectral expansion. Default is - ETruncationOption.NONE, which means no truncation. Other options + ETruncationOption.AUTO. Other options are ETruncationOption.AUTO and ETruncationOption.THIRD. Returns From 3013c80a58139d2001f17a06af4ff77a6f4f1b64 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Wed, 20 Aug 2025 18:47:24 +0200 Subject: [PATCH 17/24] Change comment about truncation option --- src/WallGo/boltzmann.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WallGo/boltzmann.py b/src/WallGo/boltzmann.py index 5c7a62d0..fe1913b7 100644 --- a/src/WallGo/boltzmann.py +++ b/src/WallGo/boltzmann.py @@ -80,8 +80,8 @@ def __init__( Default is 1.0. truncationOption : ETruncationOption, optional Option for truncating the spectral expansion. Default is - ETruncationOption.NONE, which means no truncation. Other options - are ETruncationOption.AUTO and ETruncationOption.THIRD. + ETruncationOption.AUTO. Other options + are ETruncationOption.NONE and ETruncationOption.THIRD. Returns ------- From 190ddce3dc76822c63b93fc7ca6d6058360cf271 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:00:16 +0200 Subject: [PATCH 18/24] Update test_Boltzmann.py --- tests/test_Boltzmann.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_Boltzmann.py b/tests/test_Boltzmann.py index 62a96bb1..c7fc82cd 100644 --- a/tests/test_Boltzmann.py +++ b/tests/test_Boltzmann.py @@ -138,9 +138,12 @@ def test_checkSpectralConvergence( """ # setting up objects grid = WallGo.grid.Grid(spatialGridSize, momentumGridSize, 1, 1) - boltzmann = WallGo.BoltzmannSolver(grid) - boltzmann.basisM = "Chebyshev" - boltzmann.basisN = "Chebyshev" + boltzmann = WallGo.BoltzmannSolver( + grid, + basisM="Chebyshev", + basisN="Chebyshev", + truncationOption=WallGo.ETruncationOption.AUTO, + ) # solving Boltzmann equations deltaFShape = ( From 3202138e3dfd7bd99f3213a9a7227dcaaa2a98b0 Mon Sep 17 00:00:00 2001 From: Jorinde van de Vis Date: Fri, 22 Aug 2025 14:10:04 +0200 Subject: [PATCH 19/24] addressed some pylint issues --- src/WallGo/equationOfMotion.py | 214 ++++++++++++++++++--------------- 1 file changed, 114 insertions(+), 100 deletions(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index dcf5bd47..9c1cdba1 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -53,7 +53,7 @@ def __init__( errTol: float = 1e-3, maxIterations: int = 10, pressRelErrTol: float = 0.3679, - # pylint: disable=too-many-arguments, too-many-positional-arguments + # pylint: disable=too-many-arguments ): """ Initialization @@ -136,13 +136,12 @@ def __init__( self.successTemperatureProfile = True ## Flag to detect if we were able to find the pressure self.successWallPressure = True - + ## Setup lists used to estimate the pressure derivative self.listVelocity = [] self.listPressure = [] self.listPressureError = [] - def findWallVelocityDeflagrationHybrid( self, wallThicknessIni: float | None = None ) -> WallGoResults: @@ -439,7 +438,7 @@ def solveWall( self.listVelocity = [] self.listPressure = [] self.listPressureError = [] - + results = WallGoResults() results.hasOutOfEquilibrium = self.includeOffEq @@ -453,8 +452,8 @@ def solveWall( boltzmannResultsMax, boltzmannBackgroundMax, hydroResultsMax, - EMviolationT30Max, - EMviolationT33Max, + emViolationT30Max, + emViolationT33Max, ) = self.wallPressure(wallVelocityMax, wallParamsGuess) else: ( @@ -463,8 +462,8 @@ def solveWall( boltzmannResultsMax, boltzmannBackgroundMax, hydroResultsMax, - EMviolationT30Max, - EMviolationT33Max, + emViolationT30Max, + emViolationT33Max, ) = wallPressureResultsMax # also getting the LTE results @@ -474,13 +473,13 @@ def solveWall( # hybrid solution if pressureMax < 0: logging.info("Maximum pressure on wall is negative!") - logging.info(f"{pressureMax=} {wallParamsMax=}") + logging.info("pressureMax=%s wallParamsMax=%s", pressureMax, wallParamsMax) results.setWallVelocities(None, None, wallVelocityLTE) results.setWallParams(wallParamsMax) results.setHydroResults(hydroResultsMax) results.setBoltzmannBackground(boltzmannBackgroundMax) results.setBoltzmannResults(boltzmannResultsMax) - results.setViolationOfEMConservation((EMviolationT30Max, EMviolationT33Max)) + results.setViolationOfEMConservation((emViolationT30Max, emViolationT33Max)) results.setSuccessState( True, ESolutionType.RUNAWAY, @@ -497,8 +496,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, - EMviolationT30Min, - EMviolationT33Min, + emViolationT30Min, + emViolationT33Min, ) = self.wallPressure(wallVelocityMin, wallParamsGuess) else: ( @@ -507,8 +506,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, - EMviolationT30Min, - EMviolationT33Min, + emViolationT30Min, + emViolationT33Min, ) = wallPressureResultsMin while pressureMin > 0: @@ -527,7 +526,7 @@ def solveWall( results.setBoltzmannBackground(boltzmannBackgroundMin) results.setBoltzmannResults(boltzmannResultsMin) results.setViolationOfEMConservation( - (EMviolationT30Min, EMviolationT33Min) + (emViolationT30Min, emViolationT33Min) ) results.setSuccessState( False, @@ -542,8 +541,8 @@ def solveWall( boltzmannResultsMin, boltzmannBackgroundMin, hydroResultsMin, - EMviolationT30Min, - EMviolationT33Min, + emViolationT30Min, + emViolationT33Min, ) = self.wallPressure(wallVelocityMin, wallParamsGuess) self.pressAbsErrTol = ( @@ -602,8 +601,8 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name boltzmannResults, boltzmannBackground, hydroResults, - EMviolationT30, - EMviolationT33, + emViolationT30, + emViolationT33, ) = self.wallPressure( wallVelocity, newWallParams, boltzmannResultsInput=newBoltzmannResults ) @@ -622,7 +621,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name ) boltzmannResults.linearizationCriterion1 = criterion1 boltzmannResults.linearizationCriterion2 = criterion2 - + # Computing the out-of-equilibrium pressure to get the absolute error vevLowT = boltzmannBackground.fieldProfiles.getFieldPoint(0) vevHighT = boltzmannBackground.fieldProfiles.getFieldPoint(-1) @@ -644,20 +643,22 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name dVoutdz = np.sum(np.array(dVout * dPhidz), axis=1) - # Create a Polynomial object to represent dVdz. Will be used to integrate it. + # Create a Polynomial object to represent dVdz. Will be used to integrate. dVoutdzPoly = Polynomial(dVoutdz, self.grid) dzdchi, _, _ = self.grid.getCompactificationDerivatives() offEquilPressureScale = np.abs(dVoutdzPoly.integrate(weight=-dzdchi)) - + # Compute the pressure derivative pressureDerivative = self.estimatePressureDerivative(wallVelocity) - + # estimating errors from truncation and comparison to finite differences finiteDifferenceBoltzmannResults = self.getBoltzmannFiniteDifference() # the truncation error in the spectral method within Boltzmann wallVelocityTruncationError = abs( - boltzmannResults.truncationError * offEquilPressureScale / pressureDerivative + boltzmannResults.truncationError + * offEquilPressureScale + / pressureDerivative ) # the deviation from the finite difference method within Boltzmann delta00 = boltzmannResults.Deltas.Delta00.coefficients[0] @@ -692,7 +693,7 @@ def pressureWrapper(vw: float) -> float: # pylint: disable=invalid-name results.setBoltzmannBackground(boltzmannBackground) results.setBoltzmannResults(boltzmannResults) results.setFiniteDifferenceBoltzmannResults(finiteDifferenceBoltzmannResults) - results.setViolationOfEMConservation((EMviolationT30, EMviolationT33)) + results.setViolationOfEMConservation((emViolationT30, emViolationT33)) results.eomResidual = eomResidual # Set the message @@ -827,7 +828,7 @@ def wallPressure( if wallVelocity > self.hydrodynamics.vJ: cautious = True - logging.info(f"------------- Trying {wallVelocity=:g} -------------") + logging.info("------------- Trying wallVelocity=%g -------------", wallVelocity) # Initialize the different data class objects and arrays zeroPoly = Polynomial( @@ -857,8 +858,8 @@ def wallPressure( deltaF=deltaF, Deltas=offEquilDeltas, truncationError=0.0, - truncatedTail=(False,False,False), - spectralPeaks=(0,0,0), + truncatedTail=(False, False, False), + spectralPeaks=(0, 0, 0), ) else: boltzmannResults = boltzmannResultsInput @@ -899,8 +900,8 @@ def wallPressure( wallParams, boltzmannResults, boltzmannBackground, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) = self._intermediatePressureResults( wallParams, vevLowT, @@ -938,29 +939,29 @@ def wallPressure( if self.includeOffEq: logging.debug( "%12s %12s %12s %12s %12s %12s %12s %12s %12s %12s", - 'pressure', - 'error', - 'errorSolver', - 'errTol', - 'cautious', - 'multiplier', - 'dT30Before', - 'dT30After', - 'spectralPeak', - 'truncatedTail', + "pressure", + "error", + "errorSolver", + "errTol", + "cautious", + "multiplier", + "dT30Before", + "dT30After", + "spectralPeak", + "truncatedTail", ) else: logging.debug( "%12s %12s %12s %12s %12s %12s %12s", - 'pressure', - 'error', - 'errorSolver', - 'errTol', - 'cautious', - 'multiplier', - 'dT30Before', + "pressure", + "error", + "errorSolver", + "errTol", + "cautious", + "multiplier", + "dT30Before", ) - + while True: if cautious: # Use the improved algorithm (which converges better but slowly) @@ -970,8 +971,8 @@ def wallPressure( boltzmannResults, boltzmannBackground, errorSolver, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) = self._getNextPressure( pressure, wallParams, @@ -993,8 +994,8 @@ def wallPressure( wallParams, boltzmannResults, boltzmannBackground, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) = self._intermediatePressureResults( wallParams, vevLowT, @@ -1024,22 +1025,22 @@ def wallPressure( errTol, int(cautious), multiplier, - EMviolationBefore[0], - EMviolationAfter[0], + emViolationBefore[0], + emViolationAfter[0], tuple(int(s) for s in boltzmannResults.spectralPeaks), tuple(int(t) for t in boltzmannResults.truncatedTail), ) else: logging.debug( - "%12g %12g %12g %12g %12r %12g %12g", - pressure, - error, - errorSolver, - errTol, - int(cautious), - multiplier, - EMviolationBefore[0], - ) + "%12g %12g %12g %12g %12r %12g %12g", + pressure, + error, + errorSolver, + errTol, + int(cautious), + multiplier, + emViolationBefore[0], + ) i += 1 if error < errTol or (errorSolver < errTol and cautious): @@ -1083,19 +1084,19 @@ def wallPressure( logging.info(f"Final {pressure=:g}") logging.debug(f"Final {wallParams=}") - + self.listVelocity.append(wallVelocity) self.listPressure.append(pressure) self.listPressureError.append(max(error, rtol * np.abs(pressure), atol)) - + return ( pressure, wallParams, boltzmannResults, boltzmannBackground, hydroResults, - EMviolationAfter[0], - EMviolationAfter[1], + emViolationAfter[0], + emViolationAfter[1], ) def _getNextPressure( @@ -1148,8 +1149,8 @@ def _getNextPressure( wallParams3, boltzmannResults3, boltzmannBackground3, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) = self._intermediatePressureResults( wallParams2, vevLowT, @@ -1175,8 +1176,8 @@ def _getNextPressure( boltzmannResults3, boltzmannBackground3, err, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) ## If the last iteration overshot, uses linear interpolation to find a @@ -1187,8 +1188,8 @@ def _getNextPressure( wallParams4, boltzmannResults4, boltzmannBackground4, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) = self._intermediatePressureResults( wallParams1 + (wallParams2 - wallParams1) * interpPoint, vevLowT, @@ -1210,8 +1211,8 @@ def _getNextPressure( boltzmannResults4, boltzmannBackground4, err, - EMviolationBefore, - EMviolationAfter, + emViolationBefore, + emViolationAfter, ) def _intermediatePressureResults( @@ -1275,7 +1276,8 @@ def _intermediatePressureResults( temperatureProfile = temperatureProfileInput velocityProfile = velocityProfileInput - ## Compute the violation of energy-momentum conservation before solving the Boltzmann equation + # Compute the violation of energy-momentum conservation before solving + # the Boltzmann equation violationOfEMConservationBefore = self.violationOfEMConservation( c1, c2, @@ -1362,7 +1364,8 @@ def actionWrapper( ) dVdPhi = self.thermo.effectivePotential.derivField(fields, temperatureProfile) - ## Compute the violation of energy-momentum conservation after solving the Boltzmann equation + # Compute the violation of energy-momentum conservation after + # solving the Boltzmann equation violationOfEMConservationAfter = self.violationOfEMConservation( c1, c2, @@ -1540,12 +1543,12 @@ def action( return float(U + K) def estimateTanhError( - self, - wallParams: WallParams, - boltzmannResults: BoltzmannResults, - boltzmannBackground: BoltzmannBackground, - hydroResults: HydroResults, - ) -> np.ndarray: + self, + wallParams: WallParams, + boltzmannResults: BoltzmannResults, + boltzmannBackground: BoltzmannBackground, + hydroResults: HydroResults, + ) -> np.ndarray: r""" Estimates the EOM error due to the tanh ansatz. It is estimated by the integral @@ -1553,11 +1556,13 @@ def estimateTanhError( with - .. math:: \Delta[\mathrm{EOM}^2]=\int\! dz\, (-\partial_z^2 \phi+ \partial V_{\mathrm{eq}}/ \partial \phi+ \partial V_{\mathrm{out}}/ \partial \phi )^2 + .. math:: \\Delta[\\mathrm{EOM}^2]=\\int\\! dz\\, (-\\partial_z^2 \\phi+ + \\partial V_{\\mathrm{eq}}/ \\partial \\phi+ \\partial V_{\\mathrm{out}}/ \\partial \\phi )^2 and - .. math:: |\mathrm{EOM}^2|=\int\! dz\, [(\partial_z^2 \phi)^2+ (\partial V_{\mathrm{eq}}/ \partial \phi)^2+ (\partial V_{\mathrm{out}}/ \partial \phi)^2]. + .. math:: |\\mathrm{EOM}^2|=\\int\\! dz\\, [(\\partial_z^2 \\phi)^2+ + (\\partial V_{\\mathrm{eq}}/ \\partial \\phi)^2+ (\\partial V_{\\mathrm{out}}/ \\partial \\phi)^2]. """ Tminus = hydroResults.temperatureMinus @@ -1610,9 +1615,9 @@ def estimateTanhError( dzdchi, _, _ = self.grid.getCompactificationDerivatives() eomSqResidual = eomSqPoly.integrate(axis=0, weight=dzdchi[:, None]) eomSqScaleIntegrated = eomSqScalePoly.integrate(axis=0, weight=dzdchi[:, None]) - + return eomSqResidual.coefficients / eomSqScaleIntegrated.coefficients - + def estimatePressureDerivative(self, wallVelocity: float) -> float: """ Estimates the derivative of the preessure with respect to the wall velocity from @@ -1633,9 +1638,9 @@ def estimatePressureDerivative(self, wallVelocity: float) -> float: # Number of pressure points nbrPressure = len(self.listPressure) - assert (len(self.listPressureError) == - len(self.listVelocity) == - nbrPressure >= 2), """The lists listVelocity, listPressure, + assert ( + len(self.listPressureError) == len(self.listVelocity) == nbrPressure >= 2 + ), """The lists listVelocity, listPressure, listPressureError must have the same length and contain at least two elements.""" @@ -1644,14 +1649,20 @@ def estimatePressureDerivative(self, wallVelocity: float) -> float: velocityDiff = np.array(self.listVelocity) - wallVelocity # Farter points are exponentially suppressed to make sure they don't impact the # estimate too much. - weightMatrix = np.diag(np.exp(-np.abs(velocityDiff/velocityErrorScale))/ - np.array(self.listPressureError)**2) + weightMatrix = np.diag( + np.exp(-np.abs(velocityDiff / velocityErrorScale)) + / np.array(self.listPressureError) ** 2 + ) aMatrix = np.ones((nbrPressure, 2)) - aMatrix[:,1] = velocityDiff + aMatrix[:, 1] = velocityDiff # Computes the derivative by fitting the pressure to a line - derivative = (np.linalg.inv(aMatrix.T @ weightMatrix @ aMatrix) - @ aMatrix.T @ weightMatrix @ pressures)[1] + derivative = ( + np.linalg.inv(aMatrix.T @ weightMatrix @ aMatrix) + @ aMatrix.T + @ weightMatrix + @ pressures + )[1] return derivative @@ -2091,7 +2102,8 @@ def violationOfEMConservation( wallThickness: float, ) -> Tuple[float, float]: r""" - Determines the RMS (along the grid) of the residual of the energy-momentum equations (18) of arXiv:2204.13120v1. + Determines the RMS (along the grid) of the residual of the + energy-momentum equations (18) of arXiv:2204.13120v1. Parameters ---------- @@ -2119,8 +2131,8 @@ def violationOfEMConservation( Returns ------- violationEM30, violationEM33 : (float, float) - Violation of energy-momentum conservation in T03 and T33 integrated over the grid, - normalized by the wall thickness. + Violation of energy-momentum conservation in T03 and T33 integrated over + the grid, normalized by the wall thickness. """ @@ -2175,7 +2187,8 @@ def violationEMPoint( v: float, # pylint: disable=invalid-name ) -> Tuple[float, float]: r""" - Determines the residual of the energy-momentum equations (18) of arXiv:2204.13120v1 locally. + Determines the residual of the energy-momentum equations (18) of + arXiv:2204.13120v1 locally. Parameters ---------- @@ -2201,7 +2214,8 @@ def violationEMPoint( Returns ------- violationEM30, violationEM33 : float - Violation of energy-momentum conservation in T03 and T33 at the point grid.xiValues[index]. + Violation of energy-momentum conservation in T03 and T33 at + the point grid.xiValues[index]. """ From d9bcbf34a56423494b47215f224bcac15b1eaba9 Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Tue, 26 Aug 2025 17:37:35 +0100 Subject: [PATCH 20/24] Update equationOfMotion.py Ignoring overflow warnings where we think they are benign --- src/WallGo/equationOfMotion.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 9c1cdba1..072f9aa9 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -1584,12 +1584,15 @@ def estimateTanhError( z = self.grid.xiValues fields = self.wallProfile(z, vevLowT, vevHighT, wallParams)[0] - d2FieldsDz2 = -( - (vevHighT - vevLowT) - * np.tanh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) - / np.cosh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) ** 2 - / wallParams.widths**2 - ) + with warnings.catch_warnings(): + # overflow here is benign, as just gives zero + warnings.filterwarnings("ignore", message="overflow encountered in *") + d2FieldsDz2 = -( + (vevHighT - vevLowT) + * np.tanh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) + / np.cosh(z[:, None] / wallParams.widths[None, :] + wallParams.offsets) ** 2 + / wallParams.widths**2 + ) dVdPhi = self.thermo.effectivePotential.derivField(fields, temperatureProfile) @@ -1704,7 +1707,8 @@ def wallProfile( zL = z[:, None] / wallParams.widths[None, :] # pylint: disable=invalid-name with warnings.catch_warnings(): - warnings.simplefilter("ignore") + # overflow here is benign, as just gives zero + warnings.filterwarnings("ignore", message="overflow encountered in *") fields = vevLowT + 0.5 * (vevHighT - vevLowT) * ( 1 + np.tanh(zL + wallParams.offsets) ) From 7ebe3f08c7e5e232673b42386875b7c430b8b59d Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Thu, 28 Aug 2025 09:21:31 +0200 Subject: [PATCH 21/24] Update docstring for wallPressure --- src/WallGo/equationOfMotion.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 072f9aa9..8dfffed1 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -814,7 +814,12 @@ def wallPressure( hydroResults : HydroResults HydroResults object containing the solution obtained from Hydrodynamics. Only returned if returnExtras is True - + emViolationAfter[0] : float + Violation of energy-momentum conservation in T30 after solving the + Boltzmann equation + emViolationAfter[1] : float + Violation of energy-momentum conservation in T33 after solving the + Boltzmann equation """ if atol is None: From a4f249f54e45911c3d6fbb416196f28b2c138473 Mon Sep 17 00:00:00 2001 From: benoitlaurent96 <132939700+benoitlaurent96@users.noreply.github.com> Date: Thu, 28 Aug 2025 11:05:49 +0200 Subject: [PATCH 22/24] Enhance comments in _getNextPressure() of equationOfMotion.py --- src/WallGo/equationOfMotion.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/WallGo/equationOfMotion.py b/src/WallGo/equationOfMotion.py index 8dfffed1..bc669eda 100644 --- a/src/WallGo/equationOfMotion.py +++ b/src/WallGo/equationOfMotion.py @@ -1128,6 +1128,11 @@ def _getNextPressure( interpolation to find a better estimate of the true solution. This function is called only when cautious=True in wallPressure(). """ + + # The different pressure_i, wallParams_i and boltzmannResults_i correspond to + # different iterations that the solver use to determine if it overshoots the + # true solution. If it does, it uses linear interpolation to find a better + # solution. ( pressure2, wallParams2, From 31f4fc6b6afb5963cf29baf26391865b8aba5e14 Mon Sep 17 00:00:00 2001 From: jorindevandevis <132442353+jorindevandevis@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:50:02 +0200 Subject: [PATCH 23/24] Line breaks in config --- src/WallGo/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/WallGo/config.py b/src/WallGo/config.py index 2bc26006..23a39dd2 100644 --- a/src/WallGo/config.py +++ b/src/WallGo/config.py @@ -145,7 +145,10 @@ class ConfigBoltzmannSolver: """ truncationOption: str = 'AUTO' - """ Truncation option for spectral expansions. Can be 'NONE' for no truncation, 'AUTO' to automatically detect if the spectral expansion is converging and truncate if not, or 'THIRD' which always truncates the last third. """ + """ Truncation option for spectral expansions. Can be 'NONE' for no + truncation, 'AUTO' to automatically detect if the spectral expansion + is converging and truncate if not, or 'THIRD' which always truncates + the last third. """ @dataclass class Config: @@ -311,3 +314,4 @@ def loadConfigFromFile(self, filePath: str) -> None: if 'truncationOption' in keys: self.configBoltzmannSolver.truncationOption = parser.get( "BoltzmannSolver", "truncationOption") + From 57c2c4b1a674c4a048985218eb33af10ac269d5a Mon Sep 17 00:00:00 2001 From: Oliver Gould Date: Thu, 28 Aug 2025 14:19:24 +0100 Subject: [PATCH 24/24] Update __init__.py Added ESolutionType from results, as it is already a type which is exposed to the user. --- src/WallGo/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WallGo/__init__.py b/src/WallGo/__init__.py index 5b54a534..3fb522a8 100644 --- a/src/WallGo/__init__.py +++ b/src/WallGo/__init__.py @@ -24,7 +24,7 @@ from .polynomial import Polynomial, SpectralConvergenceInfo from .thermodynamics import Thermodynamics from .equationOfMotion import EOM -from .results import WallGoResults +from .results import WallGoResults, ESolutionType from .utils import getSafePathToResource # list of submodules for lazy importing