PyTransit 2.6.3__tar.gz → 2.6.5__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 (147) hide show
  1. {pytransit-2.6.3 → pytransit-2.6.5}/MANIFEST.in +2 -0
  2. {pytransit-2.6.3 → pytransit-2.6.5}/PKG-INFO +3 -2
  3. {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/PKG-INFO +3 -2
  4. {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/SOURCES.txt +5 -0
  5. {pytransit-2.6.3 → pytransit-2.6.5}/README.md +2 -1
  6. {pytransit-2.6.3 → pytransit-2.6.5}/pyproject.toml +1 -1
  7. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/rvlpf.py +16 -9
  8. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/eclipse_model.py +1 -70
  9. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ldtkldm.py +12 -4
  10. pytransit-2.6.5/pytransit/models/numba/ldtkldm.py +91 -0
  11. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/udmodel.py +1 -2
  12. pytransit-2.6.5/pytransit/models/roadrunner/ecintersection.py +137 -0
  13. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_trspec.py +24 -19
  14. pytransit-2.6.5/pytransit/models/roadrunner/opmodel.py +111 -0
  15. pytransit-2.6.5/pytransit/models/roadrunner/opmodel_full.py +245 -0
  16. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/rrmodel.py +38 -17
  17. pytransit-2.6.5/pytransit/models/roadrunner/rrmodel_cl.py +369 -0
  18. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/tsmodel.py +14 -5
  19. pytransit-2.6.5/pytransit/utils/io/__init__.py +0 -0
  20. pytransit-2.6.3/pytransit/models/roadrunner/__init__.py +0 -1
  21. {pytransit-2.6.3 → pytransit-2.6.5}/LICENSE +0 -0
  22. {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/dependency_links.txt +0 -0
  23. {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/requires.txt +0 -0
  24. {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/top_level.txt +0 -0
  25. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/__init__.py +0 -0
  26. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/__init__.py +0 -0
  27. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/contamination.py +0 -0
  28. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/data/spectra.h5 +0 -0
  29. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/data/transmission.nc +0 -0
  30. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/filter.py +0 -0
  31. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/instrument.py +0 -0
  32. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/plotting.py +0 -0
  33. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/limb_darkening.py +0 -0
  34. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/__init__.py +0 -0
  35. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/__init__.py +0 -0
  36. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/legendrebaseline.py +0 -0
  37. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/linearbaseline.py +0 -0
  38. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/cntlpf.py +0 -0
  39. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/eclipselpf.py +0 -0
  40. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/__init__.py +0 -0
  41. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/celeriteloglikelihood.py +0 -0
  42. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/clloglikelihood.py +0 -0
  43. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/fmcloglikelihood.py +0 -0
  44. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/logisticloglikelihood.py +0 -0
  45. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/multiceleriteloglikelihood.py +0 -0
  46. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/wnloglikelihood.py +0 -0
  47. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/logposteriorfunction.py +0 -0
  48. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/lpf.py +0 -0
  49. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/mclpf.py +0 -0
  50. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/mptlpf.py +0 -0
  51. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ocllpf.py +0 -0
  52. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ocltdvlpf.py +0 -0
  53. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/oclttvlpf.py +0 -0
  54. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/phasecurvelpf.py +0 -0
  55. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tdvlpf.py +0 -0
  56. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/__init__.py +0 -0
  57. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/ctesslpf.py +0 -0
  58. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tessttvlpf.py +0 -0
  59. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tgclpf.py +0 -0
  60. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tgcmplpf.py +0 -0
  61. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tmpclpf.py +0 -0
  62. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tesslpf.py +0 -0
  63. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tessoclttvlpf.py +0 -0
  64. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/transitanalysis.py +0 -0
  65. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/transitlpf.py +0 -0
  66. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ttvlpf.py +0 -0
  67. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/__init__.py +0 -0
  68. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/gdmodel.py +0 -0
  69. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/general.py +0 -0
  70. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ldmodel.py +0 -0
  71. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/__init__.py +0 -0
  72. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/general.py +0 -0
  73. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/linear.py +0 -0
  74. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/nonlinear.py +0 -0
  75. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/power_2.py +0 -0
  76. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/quadratic.py +0 -0
  77. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/quadratic_tri.py +0 -0
  78. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/uniform.py +0 -0
  79. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_chromosphere.py +0 -0
  80. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_quadratic.py +0 -0
  81. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_quadratic_cl.py +0 -0
  82. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_uniform.py +0 -0
  83. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_uniform_cl.py +0 -0
  84. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/__init__.py +0 -0
  85. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/gdmodel.py +0 -0
  86. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/general_nb.py +0 -0
  87. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ldmodels.py +0 -0
  88. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_chromosphere_nb.py +0 -0
  89. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_quadratic_nb.py +0 -0
  90. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_uniform_nb.py +0 -0
  91. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/phasecurves.py +0 -0
  92. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/qpower2_nb.py +0 -0
  93. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/rrmodel.py +0 -0
  94. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/spmodel.py +0 -0
  95. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/ma_quadratic.cl +0 -0
  96. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/ma_uniform.cl +0 -0
  97. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/orbits.cl +0 -0
  98. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/qpower2.cl +0 -0
  99. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/osmodel.py +0 -0
  100. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/qpower2.py +0 -0
  101. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/qpower2_cl.py +0 -0
  102. {pytransit-2.6.3/pytransit/utils/io → pytransit-2.6.5/pytransit/models/roadrunner}/__init__.py +0 -0
  103. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/common.py +0 -0
  104. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model.py +0 -0
  105. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_full.py +0 -0
  106. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_simple.py +0 -0
  107. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/rrmodel.cl +0 -0
  108. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/transitmodel.py +0 -0
  109. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/uniform.py +0 -0
  110. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/__init__.py +0 -0
  111. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/orbits.py +0 -0
  112. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/orbits_py.py +0 -0
  113. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/taylor_z.py +0 -0
  114. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/__init__.py +0 -0
  115. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/parameter.py +0 -0
  116. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/prior.py +0 -0
  117. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/utilities.py +0 -0
  118. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/__init__.py +0 -0
  119. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/btsettl.py +0 -0
  120. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/data/avg_bt_settl.fits +0 -0
  121. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/data/avg_husser2013.fits +0 -0
  122. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/husser2013.py +0 -0
  123. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/__init__.py +0 -0
  124. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/astrometry.py +0 -0
  125. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/constants.py +0 -0
  126. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/de.py +0 -0
  127. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/downsample.py +0 -0
  128. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/eclipses.py +0 -0
  129. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/io/lightcurvedata.py +0 -0
  130. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/keplerlc.py +0 -0
  131. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/mdwarfs.py +0 -0
  132. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/misc.py +0 -0
  133. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/mocklc.py +0 -0
  134. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/octasphere.py +0 -0
  135. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/phasecurves.py +0 -0
  136. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/physics.py +0 -0
  137. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/rv.py +0 -0
  138. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/tess.py +0 -0
  139. {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/version.py +0 -0
  140. {pytransit-2.6.3 → pytransit-2.6.5}/setup.cfg +0 -0
  141. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_contamination.py +0 -0
  142. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_ma_quadratic.py +0 -0
  143. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_ma_quadratic_nb.py +0 -0
  144. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_qpower2_nb.py +0 -0
  145. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_uniform_model.py +0 -0
  146. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_uniform_model_nb.py +0 -0
  147. {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_z.py +0 -0
@@ -1,4 +1,6 @@
1
1
  include pytransit/contamination/data/*
2
2
  include pytransit/models/opencl/*.cl
3
3
  include pytransit/models/roadrunner/*.cl
4
+ include pytransit/models/roadrunner/*.py
5
+ include pytransit/models/numba/*.py
4
6
  include pytransit/stars/data/*.fits
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyTransit
3
- Version: 2.6.3
3
+ Version: 2.6.5
4
4
  Summary: Fast and painless exoplanet transit light curve modelling.
5
5
  Author-email: Hannu Parviainen <hpparvi@gmail.com>
6
6
  License: GPLv2
@@ -43,7 +43,8 @@ PyTransit
43
43
 
44
44
  *PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
45
45
  transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
46
- modelling individual transit light curves.
46
+ modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
47
+ paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
47
48
 
48
49
  The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
49
50
  [Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyTransit
3
- Version: 2.6.3
3
+ Version: 2.6.5
4
4
  Summary: Fast and painless exoplanet transit light curve modelling.
5
5
  Author-email: Hannu Parviainen <hpparvi@gmail.com>
6
6
  License: GPLv2
@@ -43,7 +43,8 @@ PyTransit
43
43
 
44
44
  *PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
45
45
  transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
46
- modelling individual transit light curves.
46
+ modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
47
+ paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
47
48
 
48
49
  The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
49
50
  [Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
@@ -79,6 +79,7 @@ pytransit/models/numba/__init__.py
79
79
  pytransit/models/numba/gdmodel.py
80
80
  pytransit/models/numba/general_nb.py
81
81
  pytransit/models/numba/ldmodels.py
82
+ pytransit/models/numba/ldtkldm.py
82
83
  pytransit/models/numba/ma_chromosphere_nb.py
83
84
  pytransit/models/numba/ma_quadratic_nb.py
84
85
  pytransit/models/numba/ma_uniform_nb.py
@@ -93,12 +94,16 @@ pytransit/models/opencl/orbits.cl
93
94
  pytransit/models/opencl/qpower2.cl
94
95
  pytransit/models/roadrunner/__init__.py
95
96
  pytransit/models/roadrunner/common.py
97
+ pytransit/models/roadrunner/ecintersection.py
96
98
  pytransit/models/roadrunner/model.py
97
99
  pytransit/models/roadrunner/model_full.py
98
100
  pytransit/models/roadrunner/model_simple.py
99
101
  pytransit/models/roadrunner/model_trspec.py
102
+ pytransit/models/roadrunner/opmodel.py
103
+ pytransit/models/roadrunner/opmodel_full.py
100
104
  pytransit/models/roadrunner/rrmodel.cl
101
105
  pytransit/models/roadrunner/rrmodel.py
106
+ pytransit/models/roadrunner/rrmodel_cl.py
102
107
  pytransit/models/roadrunner/tsmodel.py
103
108
  pytransit/orbits/__init__.py
104
109
  pytransit/orbits/orbits.py
@@ -9,7 +9,8 @@ PyTransit
9
9
 
10
10
  *PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
11
11
  transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
12
- modelling individual transit light curves.
12
+ modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
13
+ paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
13
14
 
14
15
  The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
15
16
  [Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "PyTransit"
3
- version = "2.6.3"
3
+ version = "2.6.5"
4
4
  description = 'Fast and painless exoplanet transit light curve modelling.'
5
5
  authors=[{name='Hannu Parviainen', email='hpparvi@gmail.com'}]
6
6
  classifiers=[
@@ -57,7 +57,7 @@ def lnlike_normal(o, m, e):
57
57
 
58
58
 
59
59
  class RVLPF(LogPosteriorFunction):
60
- def __init__(self, name: str, nplanets: int, times, rvs, rves, rvis=None):
60
+ def __init__(self, name: str, nplanets: int, times, rvs, rves, rvis=None, slope_order: int = 1):
61
61
  super().__init__(name)
62
62
 
63
63
  def transform_input(a):
@@ -77,7 +77,7 @@ class RVLPF(LogPosteriorFunction):
77
77
  rvis = zeros(len(times), 'int')
78
78
 
79
79
  self._tref = concatenate(times).mean()
80
- self.rvm: RVModel = RVModel(self, nplanets, times, rvs, rves, rvis)
80
+ self.rvm: RVModel = RVModel(self, nplanets, times, rvs, rves, rvis, slope_order=slope_order)
81
81
 
82
82
  def model(self, pv):
83
83
  return self.rvm.rv_model(pv)
@@ -103,7 +103,7 @@ class RVModel:
103
103
 
104
104
  def __init__(self, lpf: LogPosteriorFunction, nplanets: int,
105
105
  times, rvs: Iterable, rves: Iterable, rvis: Iterable,
106
- tref: Optional[float] = None):
106
+ tref: Optional[float] = None, slope_order: int = 1):
107
107
  self.lpf = lpf
108
108
 
109
109
  if hasattr(lpf, 'nplanets'):
@@ -125,6 +125,7 @@ class RVModel:
125
125
  self._rva = None
126
126
  self._rvea = None
127
127
  self._rv_ids = None
128
+ self.slope_order = slope_order
128
129
 
129
130
  self.setup_data(times, rvs, rves, rvis)
130
131
 
@@ -183,7 +184,7 @@ class RVModel:
183
184
  self._start_rvk = ps.blocks[-1].start
184
185
  self._sl_rvk = ps.blocks[-1].slice
185
186
 
186
- psl = [GParameter('rv_slope', 'linear rv slope', 'm/s', NP(0.0, 1.0), (-inf, inf))]
187
+ psl = [GParameter(f'rv_slope_{i}', 'rv slope', '', NP(0.0, 1.0), (-inf, inf)) for i in range(1, self.slope_order+1)]
187
188
  ps.add_global_block('rv_slope', psl)
188
189
  self._start_rv_slope = ps.blocks[-1].start
189
190
  self._sl_rv_slope = ps.blocks[-1].slice
@@ -202,7 +203,10 @@ class RVModel:
202
203
 
203
204
  def rv_slope(self, pvp, times):
204
205
  pvp = atleast_2d(pvp)
205
- return times * pvp[:, self._sl_rv_slope]
206
+ slope = times * pvp[:, self._start_rv_slope : self._start_rv_slope + 1]
207
+ if self.slope_order == 2:
208
+ slope += times**2 * pvp[:, self._start_rv_slope + 1: self._start_rv_slope + 2]
209
+ return slope
206
210
 
207
211
  def rv_model(self, pvp, times=None, planets=None, add_sv=True, add_slope=True):
208
212
  times = self._timea if times is None else times - self._tref
@@ -264,10 +268,10 @@ class RVModel:
264
268
  rv_time = linspace(self._timea.min() - 1, self._timea.max() + 1, num=ntimes) + self._tref
265
269
 
266
270
  if pvp is None:
267
- rv_model = self.rv_model(pv, rv_time, add_sv=False)
271
+ rv_model = self.rv_model(pv, rv_time, add_sv=False, add_slope=slope)
268
272
  rv_model_limits = None
269
273
  else:
270
- rv_percentiles = percentile(self.rv_model(pvp, rv_time, add_sv=False), [50, 16, 84, 2.5, 97.5], 0)
274
+ rv_percentiles = percentile(self.rv_model(pvp, rv_time, add_sv=False, add_slope=slope), [50, 16, 84, 2.5, 97.5], 0)
271
275
  rv_model = rv_percentiles[0]
272
276
  rv_model_limits = rv_percentiles[1:]
273
277
 
@@ -279,10 +283,13 @@ class RVModel:
279
283
  colors = len(self.rvis) * ['k']
280
284
  if markers is None:
281
285
  markers = len(self.rvis) * ['.']
282
- rvs = self._rva - self.rv_shifts(pv) - squeeze(self.rv_slope(pv, self._timea))
286
+ rvs = self._rva - self.rv_shifts(pv)
287
+ if not slope:
288
+ rvs -= squeeze(self.rv_slope(pv, self._timea))
289
+
283
290
  for iid, instrument in enumerate(self.rvis):
284
291
  m = self._rv_ids == iid
285
- axs[0].errorbar(self._timea[m] + self._tref, rvs[m], self._rvea[m], fmt='o', marker=markers[iid],
292
+ axs[0].errorbar(self._timea[m] + self._tref, rvs[m], self._rvea[m], marker=markers[iid], ls='',
286
293
  c=colors[iid], ms=4, label=instrument)
287
294
  axs[1].errorbar(self._timea[m] + self._tref, self._rva[m] - squeeze(self.rv_model(pv))[m], self._rvea[m],
288
295
  fmt='ok', ms=4)
@@ -38,7 +38,7 @@ class EclipseModel(TransitModel):
38
38
  Parameters
39
39
  ----------
40
40
  k
41
- Radius ratio(s) either as a single float, 1D vector, or 2D array.
41
+ Radius ratio(s) either as a single float or a 1D vector.
42
42
  t0
43
43
  Transit center(s) as a float or a 1D vector.
44
44
  p
@@ -97,72 +97,3 @@ class EclipseModel(TransitModel):
97
97
  flux = 1.0 + (flux - 1.0) / k**2
98
98
 
99
99
  return squeeze(flux)
100
-
101
- def evaluate_ps(self, k: float, t0: float, p: float, a: float, i: float, e: float = 0., w: float = 0., fr: Optional[float] = None) -> ndarray:
102
- """Evaluate the transit model for a set of scalar parameters.
103
-
104
- Parameters
105
- ----------
106
- k : array-like
107
- Radius ratio(s) either as a single float or an 1D array.
108
- t0 : float
109
- Transit center as a float.
110
- p : float
111
- Orbital period as a float.
112
- a : float
113
- Orbital semi-major axis divided by the stellar radius as a float.
114
- i : float
115
- Orbital inclination(s) as a float.
116
- e : float, optional
117
- Orbital eccentricity as a float.
118
- w : float, optional
119
- Argument of periastron as a float.
120
- fr : float, optional
121
- Planet-star flux ratio as a float.
122
-
123
-
124
- Notes
125
- -----
126
- This version of the `evaluate` method is optimized for calculating a single transit model (such as when using a
127
- local optimizer). If you want to evaluate the model for a large number of parameters simultaneously, use either
128
- `evaluate` or `evaluate_pv`.
129
-
130
- Returns
131
- -------
132
- ndarray
133
- Modelled flux as a 1D ndarray.
134
- """
135
- if self.time is None:
136
- raise ValueError("Need to set the data before calling the transit model.")
137
-
138
- k = asarray(k)
139
- flux = uniform_model_s(self.time, k, t0, p, a, i, e, w, self.lcids, self.pbids, self.nsamples, self.exptimes, zsign=-1.0)
140
- if fr is not None:
141
- flux = 1.0 + (flux - 1.0) * fr
142
- return squeeze(flux)
143
-
144
- def evaluate_pv(self, pvp: ndarray, fr = None) -> ndarray:
145
- """Evaluate the transit model for a 2D parameter array.
146
-
147
- Parameters
148
- ----------
149
- pvp
150
- Parameter array with a shape `(npv, npar)` where `npv` is the number of parameter vectors, and each row
151
- contains a set of parameters `[k, t0, p, a, i, e, w]`. The radius ratios can also be given per passband,
152
- in which case the row should be structured as `[k_0, k_1, k_2, ..., k_npb, t0, p, a, i, e, w]`.
153
-
154
- Notes
155
- -----
156
- This version of the `evaluate` method is optimized for calculating several models in parallel, such as when
157
- using *emcee* for MCMC sampling.
158
-
159
- Returns
160
- -------
161
- ndarray
162
- Modelled flux either as a 1D or 2D ndarray.
163
- """
164
- assert self.time is not None, "Need to set the data before calling the transit model."
165
- flux = uniform_model_pv(self.time, pvp, self.lcids, self.pbids, self.nsamples, self.exptimes, zsign=-1.0)
166
- if fr is not None:
167
- flux = 1.0 + (flux - 1.0) * fr
168
- return squeeze(flux)
@@ -18,7 +18,7 @@ from typing import Tuple, Optional, Union
18
18
  from pathlib import Path
19
19
 
20
20
  from numba import njit
21
- from numpy import zeros, interp, pi, ndarray, linspace, meshgrid, transpose
21
+ from numpy import zeros, interp, pi, ndarray, linspace, meshgrid, transpose, asarray, newaxis, errstate
22
22
  from scipy.interpolate import interpn, interpnd, RegularGridInterpolator as RGI
23
23
 
24
24
  from .ldmodel import LDModel
@@ -67,13 +67,21 @@ class LDTkLDModel(LDModel):
67
67
  self.logg0, self.dlogg, self.nlogg = loggs[0], loggs[1]-loggs[0], self.sc.client.nlogg
68
68
  self.metal0, self.dmetal, self.nmetal = zs[0], zs[1]-zs[0], self.sc.client.nz
69
69
 
70
- self.ps = self.sc.create_profiles(teff=teffg.ravel(), logg=loggg.ravel(), metal=zg.ravel())
71
- self.ps.resample(mu=self.mu)
72
- self.profiles = transpose(self.ps._ldps.copy(), axes=(1, 0, 2)).reshape((self.nteff, self.nlogg, self.nmetal, self.npb, self.nmu))
70
+ with errstate(divide='ignore'):
71
+ self.ps = self.sc.create_profiles(teff=teffg.ravel(), logg=loggg.ravel(), metal=zg.ravel())
72
+ self.ps.resample(mu=self.mu)
73
+ self.profiles = transpose(self.ps._ldps.copy(), axes=(1, 0, 2)).reshape((self.nteff, self.nlogg, self.nmetal, self.npb, self.nmu))
73
74
 
74
75
  def __call__(self, mu: ndarray, x: ndarray) -> Tuple[ndarray, ndarray]:
75
76
  if self.mu is None or id(mu) != id(self.mu):
76
77
  self._init_interpolation(mu)
78
+
79
+ x = asarray(x)
80
+ if x.ndim == 1:
81
+ x = x[newaxis, newaxis, :]
82
+ elif x.ndim == 2:
83
+ x = x[:, newaxis, :]
84
+
77
85
  ldp = trilinear_interpolation_set(self.profiles, x[:, 0, 0], x[:, 0, 1], x[:, 0, 2],
78
86
  self.teff0, self.dteff, self.nteff,
79
87
  self.logg0, self.dlogg, self.nlogg,
@@ -0,0 +1,91 @@
1
+ from numba import njit, prange
2
+ from numpy import zeros, floor, sqrt, pi
3
+
4
+
5
+ @njit
6
+ def trilinear_interpolation_unit_cube(data, x, y, z):
7
+ """Trilinear interpolation inside a unit cube.
8
+
9
+ Implementation taken from Paul Bourke's notes
10
+ https://paulbourke.net/miscellaneous/interpolation
11
+ """
12
+ n1 = data.shape[3]
13
+ n2 = data.shape[4]
14
+ ldp = zeros((n1, n2))
15
+ rx, ry, rz = (1.0 - x), (1.0 - y), (1.0 - z)
16
+
17
+ a1 = rx * ry * rz
18
+ a2 = x * ry * rz
19
+ b1 = rx * y * rz
20
+ b2 = rx * ry * z
21
+ c1 = x * ry * z
22
+ c2 = rx * y * z
23
+ d1 = x * y * rz
24
+ d2 = x * y * z
25
+
26
+ for i1 in range(n1):
27
+ for i2 in range(n2):
28
+ ldp[i1, i2] = (data[0, 0, 0, i1, i2] * a1 +
29
+ data[1, 0, 0, i1, i2] * a2 +
30
+ data[0, 1, 0, i1, i2] * b1 +
31
+ data[0, 0, 1, i1, i2] * b2 +
32
+ data[1, 0, 1, i1, i2] * c1 +
33
+ data[0, 1, 1, i1, i2] * c2 +
34
+ data[1, 1, 0, i1, i2] * d1 +
35
+ data[1, 1, 1, i1, i2] * d2)
36
+ return ldp
37
+
38
+
39
+ @njit
40
+ def trilinear_interpolation_single(data, x, y, z, x0, dx, nx, y0, dy, ny, z0, dz, nz):
41
+ x = min(max(x, x0), x0 + nx * dx)
42
+ y = min(max(y, y0), y0 + ny * dy)
43
+ z = min(max(z, z0), z0 + nz * dz)
44
+ ix = int(floor((x - x0) / dx))
45
+ iy = int(floor((y - y0) / dy))
46
+ iz = int(floor((z - z0) / dz))
47
+ ax = (x - x0 - ix * dx) / dx
48
+ ay = (y - y0 - iy * dy) / dy
49
+ az = (z - z0 - iz * dz) / dz
50
+ return trilinear_interpolation_unit_cube(data[ix:ix + 2, iy:iy + 2, iz:iz + 2, :, :], ax, ay, az)
51
+
52
+
53
+ @njit(parallel=True)
54
+ def trilinear_interpolation_set(data, xs, ys, zs, x0, dx, nx, y0, dy, ny, z0, dz, nz):
55
+ npv = xs.shape[0]
56
+ ldp = zeros((npv, data.shape[3], data.shape[4]))
57
+ for ipv in prange(npv):
58
+ ldp[ipv, :, :] = trilinear_interpolation_single(data, xs[ipv], ys[ipv], zs[ipv], x0, dx, nx, y0, dy, ny, z0, dz,
59
+ nz)
60
+ return ldp
61
+
62
+
63
+ @njit
64
+ def integrate_profiles_single(mu, ldp):
65
+ nmu = mu.size
66
+ npb = ldp.shape[0]
67
+ ldi = zeros(npb)
68
+
69
+ z = sqrt(1.0 - mu ** 2)
70
+ dz = z[1:] - z[:-1]
71
+ for ipb in range(npb):
72
+ for i in range(1, nmu):
73
+ ldi[ipb] += dz[i - 1] * 0.5 * (z[i] * ldp[ipb, i] + z[i - 1] * ldp[ipb, i - 1])
74
+ return 2.0 * pi * ldi
75
+
76
+
77
+ @njit(parallel=True)
78
+ def integrate_profiles_set(mu, ldp):
79
+ nmu = mu.size
80
+ npv = ldp.shape[0]
81
+ npb = ldp.shape[1]
82
+ ldi = zeros((npv, npb))
83
+
84
+ z = sqrt(1.0 - mu ** 2)
85
+ dz = z[1:] - z[:-1]
86
+ for j in prange(npv * npb):
87
+ ipv = j // npb
88
+ ipb = j % npb
89
+ for i in range(1, nmu):
90
+ ldi[ipv, ipb] += dz[i - 1] * 0.5 * (z[i] * ldp[ipv, ipb, i] + z[i - 1] * ldp[ipv, ipb, i - 1])
91
+ return 2.0 * pi * ldi
@@ -80,8 +80,7 @@ def uniform_model_simple(times, k, t0, p, a, i, e, w, with_derivatives):
80
80
 
81
81
 
82
82
  @njit
83
- def uniform_model_v(times, k, t0, p, dkdp, cfs, dcfs, with_derivatives,
84
- lcids, pbids, epids, nsamples, exptimes):
83
+ def uniform_model_v(times, k, t0, p, dkdp, cfs, dcfs, with_derivatives, lcids, pbids, epids, nsamples, exptimes):
85
84
  k = atleast_1d(asarray(k))
86
85
  dkdp = atleast_1d(asarray(dkdp))
87
86
  t0 = atleast_1d(asarray(t0))
@@ -0,0 +1,137 @@
1
+ from math import cos, sin, sqrt, isfinite, nan
2
+
3
+ from numpy import ndarray, fabs, pi, full, arange
4
+ from numba import njit
5
+
6
+ @njit
7
+ def create_ellipse(ny: int, k: float, f: float, a: float) -> (ndarray, ndarray):
8
+ """
9
+ Create the coordinates for a rotated ellipse.
10
+
11
+ Parameters
12
+ ----------
13
+ ny : int
14
+ The number of sample points along the y-axis.
15
+ k : float
16
+ Scale factor for the ellipse.
17
+ f : float
18
+ Flattening factor for the ellipse. Determines the extent to which the ellipse is squashed along the y-axis.
19
+ a : float
20
+ The angle of rotation for the ellipse in radians.
21
+
22
+ Returns
23
+ -------
24
+ (ndarray, ndarray)
25
+ A tuple containing two ndarrays. The first ndarray is a 1D array of y-coordinates, and the second is a 2D array of x-coordinates
26
+ corresponding to the left and right intersections of the ellipse with vertical lines through the y-coordinates.
27
+
28
+ Notes
29
+ -----
30
+ The ellipse is initially defined with its major axis aligned with the x-axis. It is then rotated by an angle `a` and scaled by a factor `k`.
31
+ The flattening factor `f` adjusts the size of the minor axis relative to the major axis, with a smaller value indicating a more flattened ellipse.
32
+ """
33
+ dy = 2 / (ny+1)
34
+ ys = arange(1, 1+ny)*dy - 1
35
+ xs = full((ny, 2), nan)
36
+ ca, sa = cos(a), sin(a)
37
+ b = 1.0 - f
38
+ b2 = b * b
39
+ ca2 = ca * ca
40
+ sa2 = sa * sa
41
+
42
+ for i in range(ny):
43
+ y = ys[i]
44
+ y2 = y * y
45
+ d = b2 * ca2 + ca2 * ca2 * (-y2) - 2 * ca2 * sa2 * y2 - sa2 * sa2 * y2 + sa2
46
+ if d >= 0:
47
+ d = sqrt(d) / b
48
+ u = (ca * sa * y) / b2 - ca * sa * y
49
+ v = sa2 / b2 + ca2
50
+ xs[i, 0] = (-d + u) / v
51
+ xs[i, 1] = (d + u) / v
52
+ return k*ys, k*xs
53
+
54
+
55
+ @njit
56
+ def ellipse_circle_intersection_area(cx: float, cy: float, z: float, k: float, f: float, xs: ndarray, ys: ndarray) -> float:
57
+ """
58
+ Calculate the intersection area between a rotated ellipse and a circle using a scanline fill approach.
59
+
60
+ Parameters
61
+ ----------
62
+ cx : float
63
+ The ellipse's center x coordinate.
64
+ cy : float
65
+ The ellipse's center y coordinate.
66
+ z : float
67
+ The center-center distance.
68
+ k : float
69
+ Radius ratio.
70
+ f : float
71
+ Flattening factor for the ellipse. Determines the extent to which the ellipse is squashed along the y-axis.
72
+ xs : ndarray
73
+ 2D array of x-coordinates corresponding to the left and right intersections of the ellipse with vertical lines through the y-coordinates.
74
+ ys : ndarray
75
+ 1D array of y-coordinates.
76
+
77
+ Returns
78
+ -------
79
+ float
80
+ The area of the intersection between the given ellipse and circle.
81
+
82
+ Notes
83
+ -----
84
+ This function employs a numerical method that iterates over a set of horizontal lines (scanlines)
85
+ to approximate the area of intersection between a circle and a rotated ellipse. The calculation considers
86
+ the rotation of the ellipse, its eccentricity, and the relative position of the ellipse to the circle.
87
+ The approach is based on the principles of scanline fill in computer graphics, adapted to the mathematical
88
+ properties of ellipses and circles.
89
+
90
+ The algorithm calculates the intersection points between each scanline and the ellipse, then integrates these
91
+ intersections over the range of y-coordinates to find the total area. It handles different cases based on the
92
+ relative position and size of the ellipse to optimize calculations.
93
+ """
94
+ if z <= 1.0 - k:
95
+ return pi * k * (1.0 - f) * k
96
+ elif z >= 1.0 + k:
97
+ return 0.0
98
+ else:
99
+ ny = ys.size
100
+ dy = (ys[1] - ys[0])
101
+ l = 0.0
102
+ if cx < -k:
103
+ for i in range(ny):
104
+ if isfinite(xs[i, 0]):
105
+ xstar = -sqrt(1.0 - (ys[i] + cy) ** 2) - cx
106
+ if xstar <= xs[i, 0]:
107
+ l += xs[i, 1] - xs[i, 0]
108
+ elif xstar <= xs[i, 1]:
109
+ l += xs[i, 1] - xstar
110
+ elif cx > k:
111
+ for i in range(ny):
112
+ if isfinite(xs[i, 0]):
113
+ xstar = sqrt(1.0 - (ys[i] + cy) ** 2) - cx
114
+ if xstar >= xs[i, 1]:
115
+ l += xs[i, 1] - xs[i, 0]
116
+ elif xstar >= xs[i, 0]:
117
+ l += xstar - xs[i, 0]
118
+ else:
119
+ for i in range(ny):
120
+ if isfinite(xs[i, 0]):
121
+ if fabs(ys[i] + cy) <= 1.0:
122
+ xstar = sqrt(1.0 - (ys[i] + cy) ** 2)
123
+ xst1 = -xstar - cx
124
+ xst2 = xstar - cx
125
+ if xst1 <= xs[i, 0]:
126
+ l += min(xst2, xs[i, 1]) - xs[i, 0]
127
+ elif xst1 > xs[i, 0]:
128
+ l += min(xst2, xs[i, 1]) - xst1
129
+ return l*dy
130
+
131
+ #else:
132
+ # for i in range(ny):
133
+ # if isfinite(xs[i,0]):
134
+ # xstar = sqrt(1.0 - (ys[i])**2) - b
135
+ # if xstar < xs[i,1]:
136
+ # l += xs[i,1]- max(xstar, xs[i,0])
137
+ # return pi*k*k*(1.0-f) - l*dy
@@ -1,5 +1,5 @@
1
1
  from math import fabs, floor
2
- from numba import njit, prange
2
+ from numba import njit, prange, get_num_threads, set_num_threads
3
3
  from numpy import zeros, dot, ndarray, isnan, full, nan, mean, floor, fabs
4
4
 
5
5
  from meepmeep.xy.position import solve_xy_p5s, pd_t15sc
@@ -13,7 +13,7 @@ from .common import circle_circle_intersection_area_kite as ccia
13
13
  def tsmodel_serial(times: ndarray,
14
14
  k: ndarray, t0: ndarray, p: ndarray, a: ndarray, i: ndarray, e: ndarray, w: ndarray,
15
15
  nsamples: ndarray, exptimes: ndarray, ldp: ndarray, istar: ndarray,
16
- weights: ndarray, dk: float, kmin: float, kmax: float, dg: float, z_edges: ndarray) -> ndarray:
16
+ weights: ndarray, dk: float, kmin: float, kmax: float, ng: int, dg: float, z_edges: ndarray) -> ndarray:
17
17
  if k.ndim != 2:
18
18
  raise ValueError(" The radius ratios must be given as a 2D array with shape (npv, npb)")
19
19
 
@@ -26,7 +26,9 @@ def tsmodel_serial(times: ndarray,
26
26
  npt = times.size
27
27
  npv = k.shape[0]
28
28
  npb = k.shape[1]
29
- ng = weights.shape[1]
29
+
30
+ if weights is not None:
31
+ ng = weights.shape[1]
30
32
 
31
33
  flux = zeros((npv, npb, npt)) # Model flux
32
34
  ldm = zeros((npb, ng)) # Limb darkening means
@@ -43,14 +45,13 @@ def tsmodel_serial(times: ndarray,
43
45
  # -----------------------------------#
44
46
  # Calculate the limb darkening means #
45
47
  # -----------------------------------#
46
- if kmin <= kmean <= kmax:
48
+ if weights is not None and kmin <= kmean <= kmax:
47
49
  ik = int(floor((kmean - kmin) / dk))
48
50
  ak = (kmean - kmin - ik * dk) / dk
49
51
  for ipb in range(npb):
50
- ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1],
51
- ldp[ipv, ipb, :])
52
+ ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1], ldp[ipv, ipb, :])
52
53
  else:
53
- _, _, wg = calculate_weights_2d(kmean, z_edges, ng)
54
+ _, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
54
55
  for ipb in range(npb):
55
56
  ldm[ipb, :] = dot(wg, ldp[ipv, ipb, :])
56
57
 
@@ -89,7 +90,12 @@ def tsmodel_serial(times: ndarray,
89
90
  def tsmodel_parallel(times: ndarray,
90
91
  k: ndarray, t0: ndarray, p: ndarray, a: ndarray, i: ndarray, e: ndarray, w: ndarray,
91
92
  nsamples: ndarray, exptimes: ndarray, ldp: ndarray, istar: ndarray,
92
- weights: ndarray, dk: float, kmin: float, kmax: float, dg: float, z_edges: ndarray) -> ndarray:
93
+ weights: ndarray, dk: float, kmin: float, kmax: float, ng: int, dg: float, z_edges: ndarray,
94
+ nthreads: int) -> ndarray:
95
+
96
+ #nthreads_current = get_num_threads()
97
+ #set_num_threads(nthreads)
98
+
93
99
  if k.ndim != 2:
94
100
  raise ValueError(" The radius ratios must be given as a 2D array with shape (npv, npb)")
95
101
 
@@ -102,7 +108,8 @@ def tsmodel_parallel(times: ndarray,
102
108
  npt = times.size
103
109
  npv = k.shape[0]
104
110
  npb = k.shape[1]
105
- ng = weights.shape[1]
111
+ if weights is not None:
112
+ ng = weights.shape[1]
106
113
 
107
114
  flux = zeros((npv, npb, npt)) # Model flux
108
115
  ldm = zeros((npb, ng)) # Limb darkening means
@@ -119,14 +126,14 @@ def tsmodel_parallel(times: ndarray,
119
126
  # -----------------------------------#
120
127
  # Calculate the limb darkening means #
121
128
  # -----------------------------------#
122
- if kmin <= kmean <= kmax:
129
+ if weights is not None and kmin <= kmean <= kmax:
123
130
  ik = int(floor((kmean - kmin) / dk))
124
131
  ak = (kmean - kmin - ik * dk) / dk
125
132
  for ipb in range(npb):
126
133
  ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1],
127
134
  ldp[ipv, ipb, :])
128
135
  else:
129
- _, _, wg = calculate_weights_2d(kmean, z_edges, ng)
136
+ _, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
130
137
  for ipb in range(npb):
131
138
  ldm[ipb, :] = dot(wg, ldp[ipv, ipb, :])
132
139
 
@@ -150,12 +157,10 @@ def tsmodel_parallel(times: ndarray,
150
157
  if fabs(tc) > hww:
151
158
  flux[ipv, :, ipt] = 1.0
152
159
  else:
153
- for isample in range(1, nsamples[0] + 1):
154
- time_offset = exptimes[0] * ((isample - 0.5) / nsamples[0] - 0.5)
155
- z = pd_t15sc(tc + time_offset, xyc)
156
- aplanet = ccia(1.0, kmean, z)[0]
157
- for ipb in range(npb):
158
- iplanet = interpolate_mean_limb_darkening_s(z / (1.0 + kmean), dg, ldm[ipb])
159
- flux[ipv, ipb, ipt] += (istar[ipv, ipb] - iplanet * aplanet * afac[ipb]) / istar[ipv, ipb]
160
- flux[ipv, :, ipt] /= nsamples[0]
160
+ z = pd_t15sc(tc, xyc)
161
+ aplanet = ccia(1.0, kmean, z)[0]
162
+ for ipb in range(npb):
163
+ iplanet = interpolate_mean_limb_darkening_s(z / (1.0 + kmean), dg, ldm[ipb])
164
+ flux[ipv, ipb, ipt] += (istar[ipv, ipb] - iplanet * aplanet * afac[ipb]) / istar[ipv, ipb]
165
+ #set_num_threads(nthreads_current)
161
166
  return flux