git: 32afad732f1c - main - math/py-heyoka: Update 0.14.0 -> 0.15.0

From: Yuri Victorovich <yuri_at_FreeBSD.org>
Date: Mon, 04 Oct 2021 19:19:36 UTC
The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=32afad732f1c177ab2c0d6a29bdeae8b4f8b967d

commit 32afad732f1c177ab2c0d6a29bdeae8b4f8b967d
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2021-10-04 17:46:02 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2021-10-04 19:18:27 +0000

    math/py-heyoka: Update 0.14.0 -> 0.15.0
    
    Reported by:    portscout
---
 math/py-heyoka/Makefile                            |  8 +++-
 math/py-heyoka/distinfo                            |  6 +--
 .../files/example-restricted-three-body-problem.py | 53 ++++++++++++++++++++++
 3 files changed, 62 insertions(+), 5 deletions(-)

diff --git a/math/py-heyoka/Makefile b/math/py-heyoka/Makefile
index 29ea55c91cc4..ca6a769fb2aa 100644
--- a/math/py-heyoka/Makefile
+++ b/math/py-heyoka/Makefile
@@ -1,7 +1,6 @@
 PORTNAME=	heyoka
 DISTVERSIONPREFIX=	v
-DISTVERSION=	0.14.0
-PORTREVISION=	1
+DISTVERSION=	0.15.0
 CATEGORIES=	math
 PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
 
@@ -21,6 +20,7 @@ RUN_DEPENDS=	${PYNUMPY} \
 		${PYTHON_PKGNAMEPREFIX}cloudpickle>0:devel/py-cloudpickle@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}mpmath>0:math/py-mpmath@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}sympy>0:math/py-sympy@${PY_FLAVOR}
+TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}matplotlib>0:math/py-matplotlib@${PY_FLAVOR}
 
 USES=		cmake compiler:c++17-lang python:3.7+
 USE_PYTHON=	flavors
@@ -32,4 +32,8 @@ GH_PROJECT=	${PORTNAME}.py
 CMAKE_ON=	HEYOKA_PY_ENABLE_IPO
 CMAKE_ARGS=	-DFREEBSD_PYTHON_DISTVERSION=${PYTHON_DISTVERSION}
 
+do-test: install
+	# integrate and plot an example
+	@${PYTHON_CMD} ${FILESDIR}/example-restricted-three-body-problem.py
+
 .include <bsd.port.mk>
diff --git a/math/py-heyoka/distinfo b/math/py-heyoka/distinfo
index f0bcf70423e6..3d66af0656f3 100644
--- a/math/py-heyoka/distinfo
+++ b/math/py-heyoka/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1630378504
-SHA256 (bluescarni-heyoka.py-v0.14.0_GH0.tar.gz) = 20fa3498be323ea2b51ec2ab5057c1193af3189df69ddffff42f62741b05994e
-SIZE (bluescarni-heyoka.py-v0.14.0_GH0.tar.gz) = 60372207
+TIMESTAMP = 1633368323
+SHA256 (bluescarni-heyoka.py-v0.15.0_GH0.tar.gz) = 0e8c4bf0cc276e52fff3e4114dc759a6f8882fe83215279bcb156403b5d11756
+SIZE (bluescarni-heyoka.py-v0.15.0_GH0.tar.gz) = 101630534
diff --git a/math/py-heyoka/files/example-restricted-three-body-problem.py b/math/py-heyoka/files/example-restricted-three-body-problem.py
new file mode 100644
index 000000000000..03500f8d4b18
--- /dev/null
+++ b/math/py-heyoka/files/example-restricted-three-body-problem.py
@@ -0,0 +1,53 @@
+import heyoka as hy
+import numpy as np
+
+# Create the symbolic variables.
+# from https://bluescarni.github.io/heyoka.py/notebooks/The%20restricted%20three-body%20problem.html
+
+x, y, z, px, py, pz = hy.make_vars("x", "y", "z", "px", "py", "pz")
+
+# Fix mu to 0.01.
+mu = 0.01
+
+rps_32 = ((x - mu)**2 + y**2 + z**2)**(-3/2.)
+rpj_32 = ((x - mu  + 1.)**2 + y**2 + z**2)**(-3/2.)
+
+# The equations of motion.
+dxdt = px + y
+dydt = py - x
+dzdt = pz
+dpxdt = py - (1. - mu) * rps_32 * (x - mu) - mu * rpj_32 * (x - mu + 1.)
+dpydt = -px -((1. - mu) * rps_32 + mu * rpj_32) * y
+dpzdt = -((1. - mu) * rps_32 + mu * rpj_32) * z
+
+# create the integrator object
+ta = hy.taylor_adaptive(
+    # The ODEs.
+    [(x, dxdt), (y, dydt), (z, dzdt),
+     (px, dpxdt), (py, dpydt), (pz, dpzdt)],
+    # The initial conditions.
+    [-0.45, 0.80, 0.00, -0.80, -0.45, 0.58],
+    # Operate below machine precision
+    # and in high-accuracy mode.
+    tol = 1e-18, high_accuracy = True
+)
+
+# integrate the RTBP up to time unit
+t_grid = np.linspace(0, 200, 2500)
+out = ta.propagate_grid(t_grid)
+print(out)
+
+# plot
+from matplotlib.pylab import plt
+plt.rcParams["figure.figsize"] = (12,6)
+
+plt.subplot(1,2,1)
+plt.plot(out[4][:, 0], out[4][:, 1])
+plt.xlabel("x")
+plt.ylabel("y")
+plt.subplot(1,2,2)
+plt.plot(out[4][:, 0], out[4][:, 2])
+plt.xlabel("x")
+plt.ylabel("z");
+
+plt.show();