TidalPy 0.7.5__tar.gz → 0.7.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tidalpy-0.7.5 → tidalpy-0.7.6}/MANIFEST.in +0 -1
- {tidalpy-0.7.5/TidalPy.egg-info → tidalpy-0.7.6}/PKG-INFO +2 -4
- {tidalpy-0.7.5 → tidalpy-0.7.6}/README.md +1 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/solver.pyx +1 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/boundaries.pxd +8 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/boundaries.pyx +69 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution.pxd +1 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution.pyx +14 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution_.hpp +4 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/shooting.pxd +2 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/shooting.pyx +23 -3
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/solver.pyx +100 -16
- tidalpy-0.7.6/TidalPy/__init__.py +95 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/configurations.py +3 -3
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/constants.pyx +12 -3
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/cooling_models.py +1 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/defaultc.py +28 -21
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/exceptions.py +13 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/orbit/__init__.py +4 -4
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/paths.py +25 -3
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/radiogenics.py +7 -3
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/love1d.py +1 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/__init__.py +2 -2
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/interp.pxd +3 -2
- tidalpy-0.7.6/TidalPy/utilities/arrays/interp_.hpp +276 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/global_map.py +2 -2
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/string_helper/__init__.py +1 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6/TidalPy.egg-info}/PKG-INFO +2 -4
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/SOURCES.txt +0 -1
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/requires.txt +0 -2
- {tidalpy-0.7.5 → tidalpy-0.7.6}/pyproject.toml +16 -9
- tidalpy-0.7.5/TidalPy/__init__.py +0 -60
- tidalpy-0.7.5/TidalPy/utilities/arrays/interp_.cpp +0 -321
- tidalpy-0.7.5/TidalPy/utilities/arrays/interp_.hpp +0 -30
- {tidalpy-0.7.5 → tidalpy-0.7.6}/LICENSE.md +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/build.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_defaultc.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_layer.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_world.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/conversion.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/defaults.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/constant.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/ice.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/pyrite.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/package.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/__init__.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution_.cpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution_.hpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/__init__.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/interpolate.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/interpolate.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/ode.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/ode.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/solver.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/__init__.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/surface_bc.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/surface_bc.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/collapse.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/collapse.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/constants.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/constants.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/odes.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/odes.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/helpers.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/interfaces.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/interfaces.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/reversed.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/reversed.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love_.cpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love_.hpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/solid_matrix.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/solid_matrix.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution_.cpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/solver.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/common.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/common.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/driver.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/driver.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/kamata.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/kamata.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/saito.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/saito.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/takeuchi.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/takeuchi.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/WorldPack/WorldPack.zip +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cache.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/constants.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/cooling.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/dual_dissipation.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/single_dissipation.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/initialize.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/logger.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/overloads.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/signatures.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/orbit/averaging.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/output.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/radiogenic_models.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/base.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/base.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/complex_compliance.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/compliance_models.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/models.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/models.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/melting_models.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/partialmelt.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/rheology.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/viscosity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/viscosity_models.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/insolation.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/stellar.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/helpers/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/helpers/orbit_config.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/basic.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/gas.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/physics.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/base.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/physics.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/physical.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/config_handler.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/iterative_builder.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/world_builder.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/basic.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/gas.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/layered.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/stellar.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/tidal.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/ctl_funcs/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/ctl_funcs/ctl_funcs.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/dissipation.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl2.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl3.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl4.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl5.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl6.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl7.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/heating.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl2.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl3.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl4.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl5.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl6.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl7.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/base.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/global_approx.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/layered.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/collapse_modes.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl2.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl3.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl4.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl5.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl6.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl7.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl2.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl3.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl4.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl5.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl6.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl7.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_manipulation.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/modes.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/multilayer_modes.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/displacements.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/heating.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/heating.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/sensitivity.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/sensitivity.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/stress_strain.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_gen_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_med_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_no_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_low_eccen_gen_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_gen_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_med_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_no_obliquity.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/synchronous_low_e.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/universal_coeffs.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/toolbox/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/toolbox/quick_tides.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/interp.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base_x.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base_x.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/config/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/config/config.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/functional_utils.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/model.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/model_utils.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions_x.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions_x.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/timing.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dictionary_utils.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional_.hpp +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/exoplanets/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/exoplanets/data_download.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/grid_plot.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/RN08-Data.csv +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/T05-Data.csv +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/yplot.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/phasespace_plot.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/planet_plot.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/cyrk_helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/julia_helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/numbalsoda_helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/scipy_helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/pathing.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/progress.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/__init__.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/complex.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/complex.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numba_special.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numerics.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numerics.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/special.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/special.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/multiprocessing/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/multiprocessing/multiprocessing.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/array_other.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/array_shape.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/memory.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/numba.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/special/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/special/factorial.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/__init__.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/mass.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/volume.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/string_helper/string_helper.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types.py +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types_x.pxd +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types_x.pyx +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/dependency_links.txt +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/entry_points.txt +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/top_level.txt +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/cython_extensions.json +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/setup.cfg +0 -0
- {tidalpy-0.7.5 → tidalpy-0.7.6}/setup.py +0 -0
|
@@ -19,7 +19,6 @@ global-include *.pyx
|
|
|
19
19
|
include cython_extensions.json
|
|
20
20
|
|
|
21
21
|
# Include required hpp and cpp files
|
|
22
|
-
include TidalPy/utilities/arrays/interp_.cpp
|
|
23
22
|
include TidalPy/utilities/arrays/interp_.hpp
|
|
24
23
|
include TidalPy/RadialSolver/love_.cpp
|
|
25
24
|
include TidalPy/RadialSolver/love_.hpp
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: TidalPy
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.6
|
|
4
4
|
Summary: Tidal Dynamics and Thermal-Orbital Evolution Software Suite Implemented in Cython and Python
|
|
5
5
|
Author-email: "Joe P. Renaud" <TidalPy@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -61,8 +61,6 @@ Requires-Dist: nbsphinx; extra == "docs"
|
|
|
61
61
|
Requires-Dist: ipykernel; extra == "docs"
|
|
62
62
|
Requires-Dist: nbconvert; extra == "docs"
|
|
63
63
|
Requires-Dist: jupyter; extra == "docs"
|
|
64
|
-
Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
|
|
65
|
-
Requires-Dist: breathe; extra == "docs"
|
|
66
64
|
Provides-Extra: graphics
|
|
67
65
|
Requires-Dist: jupyter; extra == "graphics"
|
|
68
66
|
Requires-Dist: cmcrameri<2.0,>=1.4; extra == "graphics"
|
|
@@ -84,7 +82,7 @@ Dynamic: license-file
|
|
|
84
82
|
<div align="center" style="text-align: center;">
|
|
85
83
|
<a href="https://app.readthedocs.org/projects/tidalpy/builds/?version__slug=latest"><img src="https://app.readthedocs.org/projects/tidalpy/badge/?version=latest&style=flat" alt="TidalPy Documentation" /></a>
|
|
86
84
|
<a href="https://doi.org/10.5281/zenodo.7017475"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.7017475.svg" alt="DOI: 10.5281/zenodo.7017475"></a>
|
|
87
|
-
<a href="https://github.com/jrenaud90/TidalPy/releases"><img src="https://img.shields.io/badge/TidalPy-0.7.
|
|
85
|
+
<a href="https://github.com/jrenaud90/TidalPy/releases"><img src="https://img.shields.io/badge/TidalPy-0.7.6-orange" alt="TidalPy Version 0.7.6" /></a><br />
|
|
88
86
|
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/Python-3.9|3.10|3.11|3.12|3.13-blue" alt="Python Version 3.9-3.13" /></a>
|
|
89
87
|
<a href="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_win.yml"><img src="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_win.yml/badge.svg?branch=main" alt="Windows Tests" /></a>
|
|
90
88
|
<a href="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_mac.yml"><img src="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_mac.yml/badge.svg?branch=main" alt="MacOS Tests" /></a>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<div align="center" style="text-align: center;">
|
|
6
6
|
<a href="https://app.readthedocs.org/projects/tidalpy/builds/?version__slug=latest"><img src="https://app.readthedocs.org/projects/tidalpy/badge/?version=latest&style=flat" alt="TidalPy Documentation" /></a>
|
|
7
7
|
<a href="https://doi.org/10.5281/zenodo.7017475"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.7017475.svg" alt="DOI: 10.5281/zenodo.7017475"></a>
|
|
8
|
-
<a href="https://github.com/jrenaud90/TidalPy/releases"><img src="https://img.shields.io/badge/TidalPy-0.7.
|
|
8
|
+
<a href="https://github.com/jrenaud90/TidalPy/releases"><img src="https://img.shields.io/badge/TidalPy-0.7.6-orange" alt="TidalPy Version 0.7.6" /></a><br />
|
|
9
9
|
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/Python-3.9|3.10|3.11|3.12|3.13-blue" alt="Python Version 3.9-3.13" /></a>
|
|
10
10
|
<a href="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_win.yml"><img src="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_win.yml/badge.svg?branch=main" alt="Windows Tests" /></a>
|
|
11
11
|
<a href="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_mac.yml"><img src="https://github.com/jrenaud90/TidalPy/actions/workflows/push_tests_mac.yml/badge.svg?branch=main" alt="MacOS Tests" /></a>
|
|
@@ -175,7 +175,7 @@ cdef void solve_eos(
|
|
|
175
175
|
max_step, # Maximum step size [double]
|
|
176
176
|
first_step, # Initial step size (0 = find good value) [double]
|
|
177
177
|
True, # Force retain solver
|
|
178
|
-
NULL # Analytic Jacobian (
|
|
178
|
+
NULL # Analytic Jacobian (null = numerical; used by implicit methods) [JacobianFuncType]
|
|
179
179
|
)
|
|
180
180
|
#########################################################
|
|
181
181
|
last_solution_size = integration_result_ptr.size
|
|
@@ -15,3 +15,11 @@ cdef void cf_apply_surface_bc(
|
|
|
15
15
|
cpp_bool layer_is_static,
|
|
16
16
|
cpp_bool layer_is_incomp
|
|
17
17
|
) noexcept nogil
|
|
18
|
+
|
|
19
|
+
cdef double cf_estimate_surface_amplification(
|
|
20
|
+
double complex* constant_vector_ptr,
|
|
21
|
+
double complex* uppermost_y_per_solution_ptr,
|
|
22
|
+
size_t num_sols,
|
|
23
|
+
size_t num_ys,
|
|
24
|
+
size_t max_num_y
|
|
25
|
+
) noexcept nogil
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# distutils: language = c++
|
|
2
2
|
# cython: boundscheck=False, wraparound=False, nonecheck=False, cdivision=True, initializedcheck=False
|
|
3
3
|
|
|
4
|
+
from libc.math cimport fmax
|
|
5
|
+
|
|
4
6
|
from scipy.linalg.cython_lapack cimport zgesv
|
|
5
7
|
|
|
6
|
-
from TidalPy.constants cimport d_PI, d_NAN
|
|
8
|
+
from TidalPy.constants cimport d_PI, d_NAN, d_EPS
|
|
7
9
|
|
|
8
10
|
cdef void cf_apply_surface_bc(
|
|
9
11
|
double complex* constant_vector_ptr,
|
|
@@ -184,3 +186,69 @@ cdef void cf_apply_surface_bc(
|
|
|
184
186
|
num_sols_int_ptr, # (Input)
|
|
185
187
|
bc_solution_info_ptr # (Output)
|
|
186
188
|
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
cdef double cf_estimate_surface_amplification(
|
|
192
|
+
double complex* constant_vector_ptr,
|
|
193
|
+
double complex* uppermost_y_per_solution_ptr,
|
|
194
|
+
size_t num_sols,
|
|
195
|
+
size_t num_ys,
|
|
196
|
+
size_t max_num_y
|
|
197
|
+
) noexcept nogil:
|
|
198
|
+
"""
|
|
199
|
+
cf_estimate_surface_amplification
|
|
200
|
+
|
|
201
|
+
Estimate how strongly the surface boundary condition solve amplifies error.
|
|
202
|
+
|
|
203
|
+
The collapsed surface solution is y_k = sum_s c_s * y_ks over the independent solutions s. When the
|
|
204
|
+
solution constants c_s are large and cancel (deep starting radii, high harmonic degrees), roundoff and
|
|
205
|
+
integration error in the y_ks are amplified into the collapsed values by roughly the returned factor:
|
|
206
|
+
the largest cancellation scale sum_s |c_s| |y_ks| across the y rows divided by the largest collapsed
|
|
207
|
+
magnitude |y_k|. The relative accuracy of the surface solution, and of the Love numbers derived from it,
|
|
208
|
+
is then floor limited to about (returned factor) * machine epsilon regardless of integration tolerance.
|
|
209
|
+
|
|
210
|
+
Parameters
|
|
211
|
+
----------
|
|
212
|
+
constant_vector_ptr : double complex*
|
|
213
|
+
Solution constants found by `cf_apply_surface_bc`.
|
|
214
|
+
uppermost_y_per_solution_ptr : double complex*
|
|
215
|
+
Y values at the surface for each independent solution.
|
|
216
|
+
num_sols : size_t
|
|
217
|
+
Number of independent solutions (1, 2, or 3).
|
|
218
|
+
num_ys : size_t
|
|
219
|
+
Number of y values per solution.
|
|
220
|
+
max_num_y : size_t
|
|
221
|
+
Stride between solutions in `uppermost_y_per_solution_ptr`.
|
|
222
|
+
|
|
223
|
+
Returns
|
|
224
|
+
-------
|
|
225
|
+
double
|
|
226
|
+
Amplification factor (1 when a single solution leaves no room for cancellation).
|
|
227
|
+
"""
|
|
228
|
+
cdef size_t y_i
|
|
229
|
+
cdef size_t solution_i
|
|
230
|
+
cdef double cancellation_scale
|
|
231
|
+
cdef double max_cancellation_scale = 0.0
|
|
232
|
+
cdef double max_collapsed_mag = 0.0
|
|
233
|
+
cdef double complex collapsed_value
|
|
234
|
+
cdef double complex constant
|
|
235
|
+
cdef double complex y_value
|
|
236
|
+
|
|
237
|
+
for y_i in range(num_ys):
|
|
238
|
+
cancellation_scale = 0.0
|
|
239
|
+
collapsed_value = 0.0
|
|
240
|
+
for solution_i in range(num_sols):
|
|
241
|
+
constant = constant_vector_ptr[solution_i]
|
|
242
|
+
y_value = uppermost_y_per_solution_ptr[solution_i * max_num_y + y_i]
|
|
243
|
+
cancellation_scale = cancellation_scale + abs(constant) * abs(y_value)
|
|
244
|
+
collapsed_value = collapsed_value + constant * y_value
|
|
245
|
+
max_cancellation_scale = fmax(max_cancellation_scale, cancellation_scale)
|
|
246
|
+
max_collapsed_mag = fmax(max_collapsed_mag, abs(collapsed_value))
|
|
247
|
+
|
|
248
|
+
if max_cancellation_scale <= 0.0:
|
|
249
|
+
# Degenerate all-zero surface; no cancellation information.
|
|
250
|
+
return 1.0
|
|
251
|
+
if max_collapsed_mag <= d_EPS * max_cancellation_scale:
|
|
252
|
+
# Every y row cancels completely; cap at the largest meaningful amplification.
|
|
253
|
+
return 1.0 / d_EPS
|
|
254
|
+
return max_cancellation_scale / max_collapsed_mag
|
|
@@ -47,6 +47,7 @@ cdef extern from "rs_solution_.cpp" nogil:
|
|
|
47
47
|
vector[double] full_solution_vec
|
|
48
48
|
vector[double] complex_love_vec
|
|
49
49
|
vector[size_t] shooting_method_steps_taken_vec
|
|
50
|
+
double surface_amplification
|
|
50
51
|
|
|
51
52
|
EOSSolutionCC* get_eos_solution_ptr()
|
|
52
53
|
void change_radius_array(
|
|
@@ -567,6 +567,20 @@ cdef class RadialSolverSolution:
|
|
|
567
567
|
""" Number of integration steps by layer and solution. """
|
|
568
568
|
return np.copy(self.shooting_method_steps_taken_array)
|
|
569
569
|
|
|
570
|
+
@property
|
|
571
|
+
def surface_solve_amplification(self):
|
|
572
|
+
"""Worst-case error amplification of the surface boundary condition solve (shooting method).
|
|
573
|
+
|
|
574
|
+
The collapsed surface solution combines the independent solutions with constants that can grow large
|
|
575
|
+
and cancel (deep starting radii, high harmonic degrees). Roundoff and integration error are amplified
|
|
576
|
+
into the surface solution, and the Love numbers derived from it, by up to this factor; the achievable
|
|
577
|
+
relative accuracy is floor limited to about this value times machine epsilon regardless of the
|
|
578
|
+
integration tolerance. Values near 1 indicate a well conditioned solve. Only recorded when the solve
|
|
579
|
+
runs with ``warnings`` enabled, and stays 0 for the propagation matrix method, which does not use the
|
|
580
|
+
shooting surface collapse.
|
|
581
|
+
"""
|
|
582
|
+
return self.solution_storage_ptr.surface_amplification
|
|
583
|
+
|
|
570
584
|
def get_result_by_ytype_name(self, str ytype_name):
|
|
571
585
|
"""Get a specific solution type array."""
|
|
572
586
|
cdef char ytype_i
|
|
@@ -55,6 +55,10 @@ public:
|
|
|
55
55
|
// Diagnostic data
|
|
56
56
|
std::vector<size_t> shooting_method_steps_taken_vec = std::vector<size_t>();
|
|
57
57
|
|
|
58
|
+
// Worst-case error amplification of the surface boundary condition solve across ytypes (shooting method
|
|
59
|
+
// only; stays 0 for the matrix method). See cf_estimate_surface_amplification in boundaries.pyx.
|
|
60
|
+
double surface_amplification = 0.0;
|
|
61
|
+
|
|
58
62
|
// Constructors and methods
|
|
59
63
|
virtual ~RadialSolutionStorageCC();
|
|
60
64
|
RadialSolutionStorageCC();
|
|
@@ -24,7 +24,7 @@ from TidalPy.RadialSolver.starting.driver cimport cf_find_starting_conditions
|
|
|
24
24
|
from TidalPy.RadialSolver.interfaces.interfaces cimport cf_solve_upper_y_at_interface
|
|
25
25
|
from TidalPy.RadialSolver.interfaces.reversed cimport cf_top_to_bottom_interface_bc
|
|
26
26
|
from TidalPy.RadialSolver.derivatives.odes cimport RadialSolverDiffeqArgStruct, cf_find_layer_diffeq
|
|
27
|
-
from TidalPy.RadialSolver.boundaries.boundaries cimport cf_apply_surface_bc
|
|
27
|
+
from TidalPy.RadialSolver.boundaries.boundaries cimport cf_apply_surface_bc, cf_estimate_surface_amplification
|
|
28
28
|
from TidalPy.RadialSolver.boundaries.surface_bc cimport cf_get_surface_bc
|
|
29
29
|
from TidalPy.RadialSolver.collapse.collapse cimport cf_collapse_layer_solution
|
|
30
30
|
|
|
@@ -125,7 +125,8 @@ cdef int cf_shooting_solver(
|
|
|
125
125
|
size_t expected_size,
|
|
126
126
|
size_t max_ram_MB,
|
|
127
127
|
double max_step,
|
|
128
|
-
cpp_bool verbose
|
|
128
|
+
cpp_bool verbose,
|
|
129
|
+
cpp_bool warnings
|
|
129
130
|
) noexcept nogil:
|
|
130
131
|
""" Solves the viscoelastic-gravitational problem for planets using a shooting method.
|
|
131
132
|
"""
|
|
@@ -722,7 +723,7 @@ cdef int cf_shooting_solver(
|
|
|
722
723
|
max_step_to_use, # Maximum step size [double]
|
|
723
724
|
first_step_size, # Initial step size (0 = find good value) [double]
|
|
724
725
|
True, # Force retain solver
|
|
725
|
-
NULL # Analytic Jacobian (
|
|
726
|
+
NULL # Analytic Jacobian (null = numerical; used by implicit methods) [JacobianFuncType]
|
|
726
727
|
)
|
|
727
728
|
#########################
|
|
728
729
|
|
|
@@ -783,6 +784,9 @@ cdef int cf_shooting_solver(
|
|
|
783
784
|
# No errors. Proceed with collapsing all sub-solutions into final full solution.
|
|
784
785
|
solution_storage_ptr.message = cpp_string('Integration completed for all layers. Beginning solution collapse.\n')
|
|
785
786
|
|
|
787
|
+
# Reset the surface conditioning diagnostic (the storage can be reused across solves).
|
|
788
|
+
solution_storage_ptr.surface_amplification = 0.0
|
|
789
|
+
|
|
786
790
|
for ytype_i in range(num_ytypes):
|
|
787
791
|
solution_storage_ptr.message = cpp_string('Collapsing radial solutions for "') + to_string(ytype_i) + cpp_string('" solver.\n')
|
|
788
792
|
|
|
@@ -888,6 +892,22 @@ cdef int cf_shooting_solver(
|
|
|
888
892
|
if verbose:
|
|
889
893
|
printf(solution_storage_ptr.message.c_str())
|
|
890
894
|
return solution_storage_ptr.error_code
|
|
895
|
+
|
|
896
|
+
# Record the worst-case error amplification of the surface solve across ytypes. Large
|
|
897
|
+
# constants that cancel at the surface amplify roundoff and integration error into the
|
|
898
|
+
# collapsed solution; the solver wrapper warns from this diagnostic. Skipped when the
|
|
899
|
+
# caller disabled warnings, so the hot path pays nothing for a diagnostic it will not use.
|
|
900
|
+
if warnings:
|
|
901
|
+
solution_storage_ptr.surface_amplification = fmax(
|
|
902
|
+
solution_storage_ptr.surface_amplification,
|
|
903
|
+
cf_estimate_surface_amplification(
|
|
904
|
+
constant_vector_ptr,
|
|
905
|
+
uppermost_y_per_solution_ptr,
|
|
906
|
+
num_sols,
|
|
907
|
+
num_ys,
|
|
908
|
+
MAX_NUM_Y
|
|
909
|
+
)
|
|
910
|
+
)
|
|
891
911
|
else:
|
|
892
912
|
# Working on interior layers. Will need to find the constants of integration based on the layer above.
|
|
893
913
|
cf_top_to_bottom_interface_bc(
|
|
@@ -19,7 +19,7 @@ from CyRK cimport PreEvalFunc
|
|
|
19
19
|
from TidalPy.logger import get_logger
|
|
20
20
|
from TidalPy.exceptions import UnknownModelError, ArgumentException, SolutionFailedError
|
|
21
21
|
|
|
22
|
-
from TidalPy.constants cimport d_G, d_MIN_FREQUENCY, d_MAX_FREQUENCY, d_NAN
|
|
22
|
+
from TidalPy.constants cimport d_G, d_MIN_FREQUENCY, d_MAX_FREQUENCY, d_NAN, d_EPS
|
|
23
23
|
from TidalPy.utilities.math.numerics cimport cf_isclose
|
|
24
24
|
from TidalPy.utilities.dimensions.nondimensional cimport NonDimensionalScalesCC, cf_build_nondimensional_scales
|
|
25
25
|
from TidalPy.RadialSolver.rs_solution cimport RadialSolverSolution
|
|
@@ -36,6 +36,41 @@ ctypedef EOS_ODEInput* EOS_ODEInputPtr
|
|
|
36
36
|
|
|
37
37
|
log = get_logger("TidalPy")
|
|
38
38
|
|
|
39
|
+
# The severe threshold sits well above the ~1e6 amplification of a healthy automatic-starting-radius solve.
|
|
40
|
+
SEVERE_SURFACE_AMPLIFICATION = 1.0e8
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def check_surface_solve_conditioning(
|
|
44
|
+
double surface_amplification,
|
|
45
|
+
double integration_rtol):
|
|
46
|
+
"""Log a warning when the surface boundary condition solve is poorly conditioned.
|
|
47
|
+
|
|
48
|
+
Warns when the roundoff floor (``surface_amplification`` times machine epsilon) exceeds the requested
|
|
49
|
+
integration tolerance, or when the amplification alone exceeds ``SEVERE_SURFACE_AMPLIFICATION``.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
surface_amplification : float
|
|
54
|
+
Error amplification of the surface solve (``RadialSolverSolution.surface_solve_amplification``).
|
|
55
|
+
integration_rtol : float
|
|
56
|
+
Relative tolerance the radial functions were integrated to.
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
bool
|
|
61
|
+
True when the warning was logged.
|
|
62
|
+
"""
|
|
63
|
+
if (surface_amplification * d_EPS > integration_rtol) or \
|
|
64
|
+
(surface_amplification > SEVERE_SURFACE_AMPLIFICATION):
|
|
65
|
+
log.warning(
|
|
66
|
+
f"Radial solver surface boundary condition solve is poorly conditioned (error amplification "
|
|
67
|
+
f"~{surface_amplification:0.1e}; achievable relative accuracy ~{surface_amplification * d_EPS:0.1e}; "
|
|
68
|
+
f"requested integration rtol {integration_rtol:0.1e}). Love numbers and surface outputs may be much "
|
|
69
|
+
f"less accurate than requested. A larger (or automatic) starting radius improves conditioning; "
|
|
70
|
+
f"tightening tolerances cannot beat the roundoff floor.")
|
|
71
|
+
return True
|
|
72
|
+
return False
|
|
73
|
+
|
|
39
74
|
|
|
40
75
|
cdef int cf_radial_solver(
|
|
41
76
|
RadialSolutionStorageCC* solution_storage_ptr,
|
|
@@ -159,7 +194,7 @@ cdef int cf_radial_solver(
|
|
|
159
194
|
layer_slices += 1
|
|
160
195
|
|
|
161
196
|
if layer_slices < 5:
|
|
162
|
-
solution_storage_ptr.error_code
|
|
197
|
+
solution_storage_ptr.error_code = -5
|
|
163
198
|
solution_storage_ptr.message = cpp_string('RadialSolver:: At least five layer slices per layer are required. Try using more slices in the input arrays.\n')
|
|
164
199
|
if verbose:
|
|
165
200
|
printf(solution_storage_ptr.message.c_str())
|
|
@@ -316,7 +351,7 @@ cdef int cf_radial_solver(
|
|
|
316
351
|
use_kamata, # Flag to use Kamata+ (2015)'s starting conditions vs. Takeuchi+Saito (1972) [cpp_bool]
|
|
317
352
|
starting_radius_to_use, # Starting radius for solver. For higher degree solutions you generally want to start higher up in the planet. [double]
|
|
318
353
|
start_radius_tolerance, # Tolerance used if `starting_radius` is not provided. [double]
|
|
319
|
-
integration_method_int, # Integration method
|
|
354
|
+
integration_method_int, # Integration method [CyRK ODEMethod enum]
|
|
320
355
|
integration_rtol, # Integration relative tolerance [double]
|
|
321
356
|
integration_atol, # Integration absolute tolerance [double]
|
|
322
357
|
scale_rtols_bylayer_type, # Flag for if tolerances should vary with layer type (using pre-defined scaling) [cpp_bool]
|
|
@@ -325,6 +360,7 @@ cdef int cf_radial_solver(
|
|
|
325
360
|
max_ram_MB, # Maximum amount of ram allowed for each layer's integration (note if parallelized then radial solver will exceed this value; there is also overhead of other functions) [size_t]
|
|
326
361
|
max_step, # Maximum allowed step size per layer [double]
|
|
327
362
|
verbose, # Verbose flag [cpp_bool]
|
|
363
|
+
warnings, # Warnings flag; enables the surface conditioning diagnostic [cpp_bool]
|
|
328
364
|
)
|
|
329
365
|
|
|
330
366
|
# Finalize solution storage
|
|
@@ -454,11 +490,14 @@ def radial_solver(
|
|
|
454
490
|
use_kamata : bool, default=False
|
|
455
491
|
If True, then the starting solution at the core will be based on equations from Kamata et al (2015; JGR:P)
|
|
456
492
|
Otherwise, starting solution will be based on Takeuchi and Saito (1972)
|
|
457
|
-
integration_method :
|
|
458
|
-
Which CyRK integration protocol should be used. Options that are currently available are:
|
|
459
|
-
-
|
|
460
|
-
-
|
|
461
|
-
-
|
|
493
|
+
integration_method : str, default="DOP853"
|
|
494
|
+
Which CyRK integration protocol should be used (case-insensitive). Options that are currently available are:
|
|
495
|
+
- "RK23": Runge-Kutta 2(3)
|
|
496
|
+
- "RK45": Runge-Kutta 4(5)
|
|
497
|
+
- "DOP853": Runge-Kutta / DOP 8(5/3)
|
|
498
|
+
- "BDF": Implicit multi-step method (good for stiff problems)
|
|
499
|
+
- "LSODA": Adams/BDF method with automatic stiffness detection
|
|
500
|
+
- "Radau": Implicit Runge-Kutta method of the Radau IIA family, order 5
|
|
462
501
|
integration_rtol : float64, default=1.0e-5
|
|
463
502
|
Relative integration tolerance. Lower tolerance will lead to more precise results at increased computation.
|
|
464
503
|
integration_atol : float64, default=1.0e-8
|
|
@@ -504,8 +543,10 @@ def radial_solver(
|
|
|
504
543
|
surface_pressure: float64, default=0
|
|
505
544
|
The pressure at the surface of the planet (defined as radius_array[-1]). [Pa]
|
|
506
545
|
Used for EOS calculations.
|
|
507
|
-
eos_integration_method :
|
|
508
|
-
Integration method used to solve for the planet's equation of state.
|
|
546
|
+
eos_integration_method : str, default = "DOP853"
|
|
547
|
+
Integration method used to solve for the planet's equation of state. Accepts the same options as
|
|
548
|
+
`integration_method`. LSODA can fail to take its first step at the planet's singular center; BDF and Radau
|
|
549
|
+
handle the singular start.
|
|
509
550
|
eos_rtol : double, default = 1.0e-3
|
|
510
551
|
Integration relative tolerance for equation of state solver.
|
|
511
552
|
eos_atol : double, default = 1.0e-5
|
|
@@ -517,13 +558,15 @@ def radial_solver(
|
|
|
517
558
|
verbose : bool, default=False
|
|
518
559
|
If True, then additional information will be printed to the terminal during the solution.
|
|
519
560
|
warnings : bool, default=True
|
|
520
|
-
If True, then warnings will be printed to the terminal during the solution.
|
|
561
|
+
If True, then warnings will be printed to the terminal during the solution. Also enables the shooting method's
|
|
562
|
+
surface conditioning diagnostic (`RadialSolverSolution.surface_solve_amplification`) and its warning.
|
|
521
563
|
raise_on_fail : bool, default=False
|
|
522
564
|
If True, then the solver will raise an exception if integration was not successful. By default RadialSolver
|
|
523
565
|
fails silently.
|
|
524
566
|
perform_checks : bool, default=True
|
|
525
|
-
Performs sanity checks that raise python exceptions. If turned off then these checks will be skipped providing
|
|
526
|
-
some boost to performance but at the risk of uncaught exceptions
|
|
567
|
+
Performs sanity checks that raise python exceptions. If turned off then these checks will be skipped providing
|
|
568
|
+
some boost to performance but at the risk of uncaught exceptions. The input array and tuple length checks
|
|
569
|
+
always run, whatever this is set to.
|
|
527
570
|
log_info : bool, default=False
|
|
528
571
|
Flag to turn on logging of key information (diagnostic and physical) from the RadialSolverSolution.
|
|
529
572
|
Note there is a performance hit if this is true, particularly if file logging is enabled.
|
|
@@ -539,6 +582,26 @@ def radial_solver(
|
|
|
539
582
|
cdef double last_layer_r = 0.
|
|
540
583
|
cdef size_t total_slices = radius_array.size
|
|
541
584
|
cdef size_t num_layers = len(layer_types)
|
|
585
|
+
|
|
586
|
+
# Every radial array must match the radius array's length; the solver reads and writes all
|
|
587
|
+
# of them over the radius-derived slice count, so a shorter array would be accessed out of
|
|
588
|
+
# bounds (heap corruption). These checks run even when `perform_checks` is False.
|
|
589
|
+
if total_slices == 0:
|
|
590
|
+
raise ArgumentException('radius_array must not be empty.')
|
|
591
|
+
if (<size_t>density_array.size != total_slices
|
|
592
|
+
or <size_t>complex_bulk_modulus_array.size != total_slices
|
|
593
|
+
or <size_t>complex_shear_modulus_array.size != total_slices):
|
|
594
|
+
raise ArgumentException(
|
|
595
|
+
'density, complex bulk modulus, and complex shear modulus arrays must all match '
|
|
596
|
+
f'the radius array length ({total_slices}); got {density_array.size}, '
|
|
597
|
+
f'{complex_bulk_modulus_array.size}, {complex_shear_modulus_array.size}.')
|
|
598
|
+
if <size_t>upper_radius_bylayer_array.size != num_layers:
|
|
599
|
+
raise ArgumentException(
|
|
600
|
+
f'upper_radius_bylayer_array length ({upper_radius_bylayer_array.size}) must match '
|
|
601
|
+
f'the number of layers ({num_layers}).')
|
|
602
|
+
if len(is_static_bylayer) != num_layers or len(is_incompressible_bylayer) != num_layers:
|
|
603
|
+
raise ArgumentException(
|
|
604
|
+
'layer_types, is_static_bylayer, and is_incompressible_bylayer must have equal lengths.')
|
|
542
605
|
cdef size_t layer_check, slice_check
|
|
543
606
|
cdef cpp_bool top_layer
|
|
544
607
|
cdef double last_layer_radius
|
|
@@ -691,9 +754,17 @@ def radial_solver(
|
|
|
691
754
|
integration_method_int = ODEMethod.RK23
|
|
692
755
|
elif integration_method_lower == 'dop853':
|
|
693
756
|
integration_method_int = ODEMethod.DOP853
|
|
757
|
+
elif integration_method_lower == 'bdf':
|
|
758
|
+
integration_method_int = ODEMethod.BDF
|
|
759
|
+
elif integration_method_lower == 'lsoda':
|
|
760
|
+
integration_method_int = ODEMethod.LSODA
|
|
761
|
+
elif integration_method_lower == 'radau':
|
|
762
|
+
integration_method_int = ODEMethod.RADAU
|
|
694
763
|
else:
|
|
695
|
-
raise UnknownModelError(
|
|
696
|
-
|
|
764
|
+
raise UnknownModelError(
|
|
765
|
+
f"Unsupported integration method provided: {integration_method_lower}. "
|
|
766
|
+
"Supported: rk23, rk45, dop853, bdf, lsoda, radau.")
|
|
767
|
+
|
|
697
768
|
cdef str eos_integration_method_lower = eos_integration_method.lower()
|
|
698
769
|
cdef ODEMethod eos_integration_method_int = ODEMethod.NO_METHOD_SET
|
|
699
770
|
if eos_integration_method_lower == 'rk45':
|
|
@@ -702,8 +773,16 @@ def radial_solver(
|
|
|
702
773
|
eos_integration_method_int = ODEMethod.RK23
|
|
703
774
|
elif eos_integration_method_lower == 'dop853':
|
|
704
775
|
eos_integration_method_int = ODEMethod.DOP853
|
|
776
|
+
elif eos_integration_method_lower == 'bdf':
|
|
777
|
+
eos_integration_method_int = ODEMethod.BDF
|
|
778
|
+
elif eos_integration_method_lower == 'lsoda':
|
|
779
|
+
eos_integration_method_int = ODEMethod.LSODA
|
|
780
|
+
elif eos_integration_method_lower == 'radau':
|
|
781
|
+
eos_integration_method_int = ODEMethod.RADAU
|
|
705
782
|
else:
|
|
706
|
-
raise UnknownModelError(
|
|
783
|
+
raise UnknownModelError(
|
|
784
|
+
f"Unsupported EOS integration method provided: {eos_integration_method_lower}. "
|
|
785
|
+
"Supported: rk23, rk45, dop853, bdf, lsoda, radau.")
|
|
707
786
|
|
|
708
787
|
# Convert EOS methods from string to int
|
|
709
788
|
cdef str eos_method_str
|
|
@@ -742,6 +821,10 @@ def radial_solver(
|
|
|
742
821
|
' ("tidal", "loading") # If you just want tidal and loading Love numbers.'
|
|
743
822
|
)
|
|
744
823
|
num_bc_models = len(solve_for)
|
|
824
|
+
# The boundary-condition models are written into a fixed int[5] buffer.
|
|
825
|
+
if num_bc_models > 5:
|
|
826
|
+
raise ArgumentException(
|
|
827
|
+
f'radial_solver supports at most 5 simultaneous solve_for entries; got {num_bc_models}.')
|
|
745
828
|
for i in range(num_bc_models):
|
|
746
829
|
solve_for_tmp = solve_for[i]
|
|
747
830
|
if solve_for_tmp == "free":
|
|
@@ -832,5 +915,6 @@ def radial_solver(
|
|
|
832
915
|
if warnings:
|
|
833
916
|
if np.any(solution.steps_taken > 7_000):
|
|
834
917
|
log.warning(f"Large number of steps taken found in radial solver solution (max = {np.max(solution.steps_taken)}). Recommend checking for instabilities (a good method is looking at `<solution>.plot_ys()`).")
|
|
918
|
+
check_surface_solve_conditioning(solution.surface_solve_amplification, integration_rtol)
|
|
835
919
|
|
|
836
920
|
return solution
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Find Version Number
|
|
2
|
+
import importlib.metadata
|
|
3
|
+
__version__ = importlib.metadata.version("TidalPy")
|
|
4
|
+
version = __version__
|
|
5
|
+
|
|
6
|
+
# Set test_mode to False (used to turn off logging during testing)
|
|
7
|
+
_test_mode = False
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
if os.environ.get('TIDALPY_TEST_MODE', '').strip().lower() in ('1', 'true', 'yes', 'on'):
|
|
11
|
+
_test_mode = True
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
|
|
15
|
+
# Initial Runtime
|
|
16
|
+
init_time = time.time()
|
|
17
|
+
|
|
18
|
+
# Various properties to be set by the configuration file and initializer (these should not be changed by user)
|
|
19
|
+
_tidalpy_init = False
|
|
20
|
+
_in_jupyter = False
|
|
21
|
+
_output_dir = None
|
|
22
|
+
_config_path = None
|
|
23
|
+
|
|
24
|
+
# TidalPy configurations
|
|
25
|
+
config = None
|
|
26
|
+
|
|
27
|
+
# World configuration directory
|
|
28
|
+
world_config_dir = None
|
|
29
|
+
|
|
30
|
+
# Public properties that can be changed by user
|
|
31
|
+
extensive_logging = False
|
|
32
|
+
extensive_checks = False
|
|
33
|
+
|
|
34
|
+
# Load the TidalPy initializer and run it (user can run it later so load it with the handle `reinitialize`)
|
|
35
|
+
from TidalPy.initialize import initialize as reinit
|
|
36
|
+
|
|
37
|
+
# Call reinit for the first initialization
|
|
38
|
+
reinit()
|
|
39
|
+
|
|
40
|
+
# Import module functions
|
|
41
|
+
from .cache import clear_cache as clear_cache
|
|
42
|
+
from .cache import clear_data as clear_data
|
|
43
|
+
|
|
44
|
+
# Announce the backend change coming in TidalPy 0.8.0, once per session.
|
|
45
|
+
import warnings as _warnings
|
|
46
|
+
from TidalPy.exceptions import TidalPyDeprecationWarning
|
|
47
|
+
|
|
48
|
+
_warnings.warn(
|
|
49
|
+
"TidalPy 0.8.0 will replace this version's backend with a new C++ backend. The current modules (structures, tides," \
|
|
50
|
+
"RadialSolver, rheology, ...) will be removed and module, class, and function names and signatures will change," \
|
|
51
|
+
"so code written for TidalPy 0.7.X will need to be updated. Pin 'TidalPy<0.8' to keep using the current API." \
|
|
52
|
+
"Silence this message with" \
|
|
53
|
+
"warnings.filterwarnings('ignore', category=TidalPy.exceptions.TidalPyDeprecationWarning).",
|
|
54
|
+
TidalPyDeprecationWarning,
|
|
55
|
+
stacklevel=2)
|
|
56
|
+
|
|
57
|
+
def test_mode():
|
|
58
|
+
""" Turn on test mode and reinitialize TidalPy """
|
|
59
|
+
global _test_mode
|
|
60
|
+
|
|
61
|
+
if _test_mode:
|
|
62
|
+
# Don't need to do anything.
|
|
63
|
+
pass
|
|
64
|
+
else:
|
|
65
|
+
_test_mode = True
|
|
66
|
+
reinit()
|
|
67
|
+
|
|
68
|
+
def log_to_file():
|
|
69
|
+
""" Quick switch to turn on saving logs to file """
|
|
70
|
+
if not config['logging']['write_log_to_disk']:
|
|
71
|
+
config['logging']['write_log_to_disk'] = True
|
|
72
|
+
reinit()
|
|
73
|
+
|
|
74
|
+
# Helper function that provides directories to TidalPy's (and CyRK's) C++ headers
|
|
75
|
+
def get_include():
|
|
76
|
+
""" Return the include directories of TidalPy's C++ source files, plus CyRK's, for dependent builds. """
|
|
77
|
+
import CyRK
|
|
78
|
+
|
|
79
|
+
# Since we depend on CyRK to build TidalPy; we likely want to include its headers as well.
|
|
80
|
+
tidalpy_dirs = CyRK.get_include()
|
|
81
|
+
|
|
82
|
+
tidalpy_dir = os.path.dirname(__file__)
|
|
83
|
+
tidalpy_dirs += [
|
|
84
|
+
# Utilities
|
|
85
|
+
os.path.join(tidalpy_dir, 'utilities', 'arrays'),
|
|
86
|
+
os.path.join(tidalpy_dir, 'utilities', 'dimensions'),
|
|
87
|
+
|
|
88
|
+
# RadialSolver
|
|
89
|
+
os.path.join(tidalpy_dir, 'RadialSolver'),
|
|
90
|
+
|
|
91
|
+
# Material
|
|
92
|
+
os.path.join(tidalpy_dir, 'Material', 'eos')
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
return tidalpy_dirs
|
|
@@ -59,7 +59,7 @@ def save_dict_to_toml(dict_to_save: dict,
|
|
|
59
59
|
# Append a number to the config name until one is found that is not already in use.
|
|
60
60
|
file_path = unique_path(file_path, is_dir=False, make_dir=False)
|
|
61
61
|
|
|
62
|
-
with open(file_path, 'w') as toml_file:
|
|
62
|
+
with open(file_path, 'w', encoding='utf-8') as toml_file:
|
|
63
63
|
toml_output = toml.dump(dict_to_save, toml_file)
|
|
64
64
|
return toml_output
|
|
65
65
|
|
|
@@ -87,7 +87,7 @@ def check_config_version(
|
|
|
87
87
|
Flag for if this configuration file is compatible.
|
|
88
88
|
"""
|
|
89
89
|
compatible = False
|
|
90
|
-
with open(config_path, 'r') as config_file:
|
|
90
|
+
with open(config_path, 'r', encoding='utf-8') as config_file:
|
|
91
91
|
config_version_found = False
|
|
92
92
|
for line in islice(config_file, 0, 10): # Assume the version number is in the first 10 lines
|
|
93
93
|
if 'version:' in line.lower():
|
|
@@ -134,7 +134,7 @@ def get_default_config() -> dict:
|
|
|
134
134
|
# Check if TidalPy's config file is not present.
|
|
135
135
|
if not os.path.isfile(config_path):
|
|
136
136
|
# Create toml file with default configurations.
|
|
137
|
-
with open(config_path, 'w') as config_file:
|
|
137
|
+
with open(config_path, 'w', encoding='utf-8') as config_file:
|
|
138
138
|
config_file.write('#===========================================================#\n')
|
|
139
139
|
config_file.write(f'# TidalPy Default Configurations for Version: {version}\n')
|
|
140
140
|
config_file.write('#===========================================================#\n\n')
|
|
@@ -73,13 +73,15 @@ from scipy.constants import G as G_
|
|
|
73
73
|
from scipy.constants import au as au_
|
|
74
74
|
from scipy.constants import Stefan_Boltzmann
|
|
75
75
|
from scipy.constants import R as R_
|
|
76
|
+
from scipy.constants import k as k_
|
|
77
|
+
from scipy.constants import Julian_year
|
|
76
78
|
|
|
77
79
|
# Sun
|
|
78
80
|
cdef double d_mass_solar = 1.988435e30 # [kg]
|
|
79
81
|
mass_solar = d_mass_solar
|
|
80
82
|
cdef double d_radius_solar = 6.957e8 # [m]
|
|
81
83
|
radius_solar = d_radius_solar
|
|
82
|
-
cdef double d_luminosity_solar = 3.
|
|
84
|
+
cdef double d_luminosity_solar = 3.828e26 # IAU 2015 nominal [Watts]
|
|
83
85
|
luminosity_solar = d_luminosity_solar
|
|
84
86
|
|
|
85
87
|
# TRAPPIST-1
|
|
@@ -97,9 +99,9 @@ cdef double d_radius_earth = 6.371008e6 # [m]
|
|
|
97
99
|
radius_earth = d_radius_earth
|
|
98
100
|
|
|
99
101
|
# Jupiter
|
|
100
|
-
cdef double d_mass_jupiter = 1.
|
|
102
|
+
cdef double d_mass_jupiter = 1.898125e27 # [kg]
|
|
101
103
|
mass_jupiter = d_mass_jupiter
|
|
102
|
-
cdef double d_radius_jupiter = 6.9911e7 # [m]
|
|
104
|
+
cdef double d_radius_jupiter = 6.9911e7 # IAU nominal mean radius [m]
|
|
103
105
|
radius_jupiter = d_radius_jupiter
|
|
104
106
|
|
|
105
107
|
# Pluto
|
|
@@ -129,6 +131,13 @@ SBC = d_SBC
|
|
|
129
131
|
cdef double d_newtons_constant = G
|
|
130
132
|
newtons_constant = d_newtons_constant
|
|
131
133
|
|
|
134
|
+
# Boltzmann's constant [J K-1]
|
|
135
|
+
k_boltzmann = k_
|
|
136
|
+
|
|
137
|
+
# Julian year [s]
|
|
138
|
+
year = Julian_year
|
|
139
|
+
yr = year
|
|
140
|
+
|
|
132
141
|
cdef double d_M_sol = mass_solar
|
|
133
142
|
M_sol = d_M_sol
|
|
134
143
|
cdef double d_M_earth = mass_earth
|
|
@@ -112,7 +112,7 @@ def convection(
|
|
|
112
112
|
# Calculate the Rayleigh number and then check for over/under shoots
|
|
113
113
|
rayleigh = parcel_rise_rate / rate_heat_loss
|
|
114
114
|
rayleigh = (delta_temp_shape > float_eps) * rayleigh
|
|
115
|
-
rayleigh = (layer_thickness_shape
|
|
115
|
+
rayleigh = (layer_thickness_shape > MIN_THICKNESS) * rayleigh
|
|
116
116
|
|
|
117
117
|
# Calculate the Nusselt number and then check for over/under shoots (minimum nusselt = 2.)
|
|
118
118
|
nusselt = convection_alpha * (rayleigh / critical_rayleigh)**convection_beta
|