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.
Files changed (295) hide show
  1. {tidalpy-0.7.5 → tidalpy-0.7.6}/MANIFEST.in +0 -1
  2. {tidalpy-0.7.5/TidalPy.egg-info → tidalpy-0.7.6}/PKG-INFO +2 -4
  3. {tidalpy-0.7.5 → tidalpy-0.7.6}/README.md +1 -1
  4. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/solver.pyx +1 -1
  5. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/boundaries.pxd +8 -0
  6. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/boundaries.pyx +69 -1
  7. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution.pxd +1 -0
  8. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution.pyx +14 -0
  9. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution_.hpp +4 -0
  10. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/shooting.pxd +2 -1
  11. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/shooting.pyx +23 -3
  12. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/solver.pyx +100 -16
  13. tidalpy-0.7.6/TidalPy/__init__.py +95 -0
  14. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/configurations.py +3 -3
  15. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/constants.pyx +12 -3
  16. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/cooling_models.py +1 -1
  17. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/defaultc.py +28 -21
  18. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/exceptions.py +13 -0
  19. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/orbit/__init__.py +4 -4
  20. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/paths.py +25 -3
  21. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/radiogenics.py +7 -3
  22. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/love1d.py +1 -1
  23. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/__init__.py +2 -2
  24. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/interp.pxd +3 -2
  25. tidalpy-0.7.6/TidalPy/utilities/arrays/interp_.hpp +276 -0
  26. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/global_map.py +2 -2
  27. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/string_helper/__init__.py +1 -1
  28. {tidalpy-0.7.5 → tidalpy-0.7.6/TidalPy.egg-info}/PKG-INFO +2 -4
  29. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/SOURCES.txt +0 -1
  30. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/requires.txt +0 -2
  31. {tidalpy-0.7.5 → tidalpy-0.7.6}/pyproject.toml +16 -9
  32. tidalpy-0.7.5/TidalPy/__init__.py +0 -60
  33. tidalpy-0.7.5/TidalPy/utilities/arrays/interp_.cpp +0 -321
  34. tidalpy-0.7.5/TidalPy/utilities/arrays/interp_.hpp +0 -30
  35. {tidalpy-0.7.5 → tidalpy-0.7.6}/LICENSE.md +0 -0
  36. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/__init__.py +0 -0
  37. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/__init__.py +0 -0
  38. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/build.py +0 -0
  39. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_defaultc.py +0 -0
  40. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_layer.py +0 -0
  41. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/burnman_world.py +0 -0
  42. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/conversion.py +0 -0
  43. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/defaults.py +0 -0
  44. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/__init__.py +0 -0
  45. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/__init__.py +0 -0
  46. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/constant.py +0 -0
  47. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/ice.py +0 -0
  48. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/custom/pyrite.py +0 -0
  49. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/material/helper.py +0 -0
  50. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Extending/burnman/package.py +0 -0
  51. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/__init__.py +0 -0
  52. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/__init__.pxd +0 -0
  53. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/__init__.py +0 -0
  54. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution.pxd +0 -0
  55. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution.pyx +0 -0
  56. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution_.cpp +0 -0
  57. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/eos_solution_.hpp +0 -0
  58. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/__init__.pxd +0 -0
  59. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/__init__.py +0 -0
  60. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/interpolate.pxd +0 -0
  61. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/methods/interpolate.pyx +0 -0
  62. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/ode.pxd +0 -0
  63. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/ode.pyx +0 -0
  64. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/Material/eos/solver.pxd +0 -0
  65. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/__init__.pxd +0 -0
  66. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/__init__.py +0 -0
  67. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/__init__.py +0 -0
  68. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/surface_bc.pxd +0 -0
  69. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/boundaries/surface_bc.pyx +0 -0
  70. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/__init__.py +0 -0
  71. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/collapse.pxd +0 -0
  72. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/collapse/collapse.pyx +0 -0
  73. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/constants.pxd +0 -0
  74. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/constants.pyx +0 -0
  75. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/__init__.py +0 -0
  76. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/odes.pxd +0 -0
  77. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/derivatives/odes.pyx +0 -0
  78. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/helpers.pyx +0 -0
  79. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/__init__.py +0 -0
  80. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/interfaces.pxd +0 -0
  81. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/interfaces.pyx +0 -0
  82. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/reversed.pxd +0 -0
  83. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/interfaces/reversed.pyx +0 -0
  84. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love.pxd +0 -0
  85. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love.pyx +0 -0
  86. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love_.cpp +0 -0
  87. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/love_.hpp +0 -0
  88. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix.pxd +0 -0
  89. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix.pyx +0 -0
  90. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/__init__.py +0 -0
  91. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/solid_matrix.pxd +0 -0
  92. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/matrix_types/solid_matrix.pyx +0 -0
  93. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/rs_solution_.cpp +0 -0
  94. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/solver.pxd +0 -0
  95. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/__init__.py +0 -0
  96. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/common.pxd +0 -0
  97. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/common.pyx +0 -0
  98. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/driver.pxd +0 -0
  99. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/driver.pyx +0 -0
  100. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/kamata.pxd +0 -0
  101. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/kamata.pyx +0 -0
  102. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/saito.pxd +0 -0
  103. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/saito.pyx +0 -0
  104. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/takeuchi.pxd +0 -0
  105. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/RadialSolver/starting/takeuchi.pyx +0 -0
  106. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/WorldPack/WorldPack.zip +0 -0
  107. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cache.py +0 -0
  108. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/constants.pxd +0 -0
  109. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/__init__.py +0 -0
  110. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/cooling/cooling.py +0 -0
  111. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/__init__.py +0 -0
  112. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/dual_dissipation.py +0 -0
  113. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/dynamics/single_dissipation.py +0 -0
  114. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/initialize.py +0 -0
  115. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/logger.py +0 -0
  116. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/__init__.py +0 -0
  117. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/__init__.py +0 -0
  118. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/overloads.py +0 -0
  119. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/numba_scipy/special/signatures.py +0 -0
  120. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/orbit/averaging.py +0 -0
  121. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/output.py +0 -0
  122. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/__init__.py +0 -0
  123. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/radiogenics/radiogenic_models.py +0 -0
  124. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/__init__.py +0 -0
  125. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/base.pxd +0 -0
  126. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/base.pyx +0 -0
  127. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/__init__.py +0 -0
  128. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/complex_compliance.py +0 -0
  129. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/complex_compliance/compliance_models.py +0 -0
  130. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/models.pxd +0 -0
  131. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/models.pyx +0 -0
  132. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/__init__.py +0 -0
  133. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/melting_models.py +0 -0
  134. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/partial_melt/partialmelt.py +0 -0
  135. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/rheology.py +0 -0
  136. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/__init__.py +0 -0
  137. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/viscosity.py +0 -0
  138. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/rheology/viscosity/viscosity_models.py +0 -0
  139. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/__init__.py +0 -0
  140. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/insolation.py +0 -0
  141. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/stellar/stellar.py +0 -0
  142. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/__init__.py +0 -0
  143. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/helpers/__init__.py +0 -0
  144. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/helpers/orbit_config.py +0 -0
  145. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/__init__.py +0 -0
  146. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/basic.py +0 -0
  147. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/gas.py +0 -0
  148. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/helper.py +0 -0
  149. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/layers/physics.py +0 -0
  150. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/__init__.py +0 -0
  151. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/base.py +0 -0
  152. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/orbit/physics.py +0 -0
  153. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/physical.py +0 -0
  154. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/__init__.py +0 -0
  155. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/config_handler.py +0 -0
  156. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/iterative_builder.py +0 -0
  157. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_builder/world_builder.py +0 -0
  158. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/__init__.py +0 -0
  159. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/basic.py +0 -0
  160. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/gas.py +0 -0
  161. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/layered.py +0 -0
  162. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/stellar.py +0 -0
  163. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/structures/world_types/tidal.py +0 -0
  164. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/__init__.py +0 -0
  165. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/ctl_funcs/__init__.py +0 -0
  166. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/ctl_funcs/ctl_funcs.py +0 -0
  167. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/dissipation.py +0 -0
  168. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/__init__.py +0 -0
  169. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl2.py +0 -0
  170. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl3.py +0 -0
  171. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl4.py +0 -0
  172. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl5.py +0 -0
  173. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl6.py +0 -0
  174. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/eccentricity_funcs/orderl7.py +0 -0
  175. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/heating.py +0 -0
  176. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/__init__.py +0 -0
  177. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl2.py +0 -0
  178. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl3.py +0 -0
  179. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl4.py +0 -0
  180. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl5.py +0 -0
  181. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl6.py +0 -0
  182. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/inclination_funcs/orderl7.py +0 -0
  183. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/__init__.py +0 -0
  184. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/base.py +0 -0
  185. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/global_approx.py +0 -0
  186. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/methods/layered.py +0 -0
  187. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/collapse_modes.py +0 -0
  188. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/__init__.py +0 -0
  189. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl2.py +0 -0
  190. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl3.py +0 -0
  191. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl4.py +0 -0
  192. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl5.py +0 -0
  193. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl6.py +0 -0
  194. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/eccen_calc_orderl7.py +0 -0
  195. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl2.py +0 -0
  196. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl3.py +0 -0
  197. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl4.py +0 -0
  198. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl5.py +0 -0
  199. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl6.py +0 -0
  200. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_calc_helper/inclin_calc_orderl7.py +0 -0
  201. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/mode_manipulation.py +0 -0
  202. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/modes.py +0 -0
  203. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/modes/multilayer_modes.py +0 -0
  204. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/__init__.py +0 -0
  205. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/displacements.py +0 -0
  206. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/heating.pxd +0 -0
  207. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/heating.pyx +0 -0
  208. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/sensitivity.pxd +0 -0
  209. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/sensitivity.pyx +0 -0
  210. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/multilayer/stress_strain.py +0 -0
  211. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/__init__.py +0 -0
  212. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_gen_obliquity.py +0 -0
  213. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_med_obliquity.py +0 -0
  214. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_med_eccen_no_obliquity.py +0 -0
  215. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_low_eccen_gen_obliquity.py +0 -0
  216. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_gen_obliquity.py +0 -0
  217. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_med_obliquity.py +0 -0
  218. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/nsr_modes_med_eccen_no_obliquity.py +0 -0
  219. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/potential/synchronous_low_e.py +0 -0
  220. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/tides/universal_coeffs.py +0 -0
  221. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/toolbox/__init__.py +0 -0
  222. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/toolbox/quick_tides.py +0 -0
  223. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/__init__.py +0 -0
  224. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/__init__.py +0 -0
  225. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/arrays/interp.pyx +0 -0
  226. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/__init__.py +0 -0
  227. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base.py +0 -0
  228. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base_x.pxd +0 -0
  229. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/base_x.pyx +0 -0
  230. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/config/__init__.py +0 -0
  231. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/config/config.py +0 -0
  232. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/__init__.py +0 -0
  233. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/functional_utils.py +0 -0
  234. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/model.py +0 -0
  235. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/classes/model/model_utils.py +0 -0
  236. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/__init__.py +0 -0
  237. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions.py +0 -0
  238. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions_x.pxd +0 -0
  239. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/conversions_x.pyx +0 -0
  240. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/conversions/timing.py +0 -0
  241. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dictionary_utils.py +0 -0
  242. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/__init__.py +0 -0
  243. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional.pxd +0 -0
  244. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional.pyx +0 -0
  245. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/dimensions/nondimensional_.hpp +0 -0
  246. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/exoplanets/__init__.py +0 -0
  247. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/exoplanets/data_download.py +0 -0
  248. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/__init__.py +0 -0
  249. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/grid_plot.py +0 -0
  250. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/RN08-Data.csv +0 -0
  251. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/T05-Data.csv +0 -0
  252. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/__init__.py +0 -0
  253. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/multilayer/yplot.py +0 -0
  254. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/phasespace_plot.py +0 -0
  255. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/graphics/planet_plot.py +0 -0
  256. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/__init__.py +0 -0
  257. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/cyrk_helper.py +0 -0
  258. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/julia_helper.py +0 -0
  259. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/numbalsoda_helper.py +0 -0
  260. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/integration/scipy_helper.py +0 -0
  261. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/__init__.py +0 -0
  262. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/pathing.py +0 -0
  263. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/io/progress.py +0 -0
  264. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/__init__.pxd +0 -0
  265. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/__init__.py +0 -0
  266. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/complex.pxd +0 -0
  267. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/complex.pyx +0 -0
  268. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numba_special.py +0 -0
  269. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numerics.pxd +0 -0
  270. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/numerics.pyx +0 -0
  271. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/special.pxd +0 -0
  272. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/math/special.pyx +0 -0
  273. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/multiprocessing/__init__.py +0 -0
  274. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/multiprocessing/multiprocessing.py +0 -0
  275. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/__init__.py +0 -0
  276. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/array_other.py +0 -0
  277. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/numpy_helper/array_shape.py +0 -0
  278. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/__init__.py +0 -0
  279. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/memory.py +0 -0
  280. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/numba.py +0 -0
  281. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/special/__init__.py +0 -0
  282. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/performance/special/factorial.py +0 -0
  283. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/__init__.py +0 -0
  284. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/mass.py +0 -0
  285. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/spherical_helper/volume.py +0 -0
  286. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/string_helper/string_helper.py +0 -0
  287. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types.py +0 -0
  288. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types_x.pxd +0 -0
  289. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy/utilities/types_x.pyx +0 -0
  290. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/dependency_links.txt +0 -0
  291. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/entry_points.txt +0 -0
  292. {tidalpy-0.7.5 → tidalpy-0.7.6}/TidalPy.egg-info/top_level.txt +0 -0
  293. {tidalpy-0.7.5 → tidalpy-0.7.6}/cython_extensions.json +0 -0
  294. {tidalpy-0.7.5 → tidalpy-0.7.6}/setup.cfg +0 -0
  295. {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.5
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.0a0.dev7-orange" alt="TidalPy Version 0.7.0a0.dev7" /></a><br />
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.0a0.dev7-orange" alt="TidalPy Version 0.7.0a0.dev7" /></a><br />
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 (only used by implicit methods) [JacobianFuncType]
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();
@@ -38,5 +38,6 @@ cdef int cf_shooting_solver(
38
38
  size_t expected_size,
39
39
  size_t max_ram_MB,
40
40
  double max_step,
41
- cpp_bool verbose
41
+ cpp_bool verbose,
42
+ cpp_bool warnings
42
43
  ) noexcept nogil
@@ -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 (only used by implicit methods) [JacobianFuncType]
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 == -5
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 int (0=RK23, 1=RK45, 2=DOP853) [unsigned char]
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 : int32, default="DOP853"
458
- Which CyRK integration protocol should be used. Options that are currently available are:
459
- - 0: Runge-Kutta 2(3)
460
- - 1: Runge-Kutta 4(5)
461
- - 2: Runge-Kutta / DOP 8(5/3)
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 : unsigned int, default = "DOP853"
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 (crashes).
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(f"Unsupported integration method provided: {integration_method_lower}.")
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(f"Unsupported EOS integration method provided: {eos_integration_method_lower}.")
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.848e26 # [Watts]
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.89813e27 # [kg]
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 >= MIN_THICKNESS) * rayleigh
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