From 7f1628fb29db06c12a3050a317bd981cdec7d64b Mon Sep 17 00:00:00 2001 From: Jrenaud-Desk Date: Mon, 25 Nov 2024 18:56:02 -0500 Subject: [PATCH] Identified floating point errors --- .../RadialSolver Benchmarks.ipynb | 126 +- TODO.md | 1 + Tests/Cython experiments.ipynb | 2067 +---------------- TidalPy/RadialSolver/derivatives/odes.pyx | 81 +- pyproject.toml | 4 +- 5 files changed, 128 insertions(+), 2151 deletions(-) diff --git a/Benchmarks & Performance/RadialSolver/RadialSolver Benchmarks.ipynb b/Benchmarks & Performance/RadialSolver/RadialSolver Benchmarks.ipynb index 930e7ceb..1e310d0e 100644 --- a/Benchmarks & Performance/RadialSolver/RadialSolver Benchmarks.ipynb +++ b/Benchmarks & Performance/RadialSolver/RadialSolver Benchmarks.ipynb @@ -1,55 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "8e0aa371-6883-4db6-8d40-c6c41b17358e", - "metadata": {}, - "outputs": [], - "source": [ - "import cython" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "41ada8ba-28cd-4a0b-8e9a-3c14590a7e15", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext cython" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6c498d42-6a58-4afc-960d-d54258ccbeb6", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "UsageError: Cell magic `%%cython` not found.\n" - ] - } - ], - "source": [ - "%%cython -f -a\n", - "# distutils: language = c++\n", - "# cython: boundscheck=False, wraparound=False, nonecheck=False, cdivision=True, initializedcheck=False\n", - "\n", - "from CyRK.utils.memory cimport shared_ptr, make_shared\n", - "\n", - "cdef struct Alpha:\n", - " double x\n", - " double y\n", - "\n", - "cdef shared_ptr[Alpha] x = make_shared[Alpha](10., 30.)\n", - "\n", - "print(x.get().y)" - ] - }, { "cell_type": "code", "execution_count": 1, @@ -60,7 +10,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.6.0a7.dev4\n" + "0.6.0a7.dev8\n" ] } ], @@ -87,20 +37,36 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "id": "7d9c6658-deca-477c-8c9f-b32d0c7f0913", "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'np' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[1], line 88\u001b[0m\n\u001b[0;32m 77\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m solution\n\u001b[0;32m 79\u001b[0m \u001b[38;5;66;03m# 0.5.4\u001b[39;00m\n\u001b[0;32m 80\u001b[0m \u001b[38;5;66;03m# New: 3.12ms; 3.07ms; 3.15ms\u001b[39;00m\n\u001b[0;32m 81\u001b[0m \u001b[38;5;66;03m# Old: 94ms; 96.6ms; 94.3ms\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[38;5;66;03m# 0.6.0a6\u001b[39;00m\n\u001b[0;32m 86\u001b[0m \u001b[38;5;66;03m# New: 3.37ms; 3.14ms; 3.16ms\u001b[39;00m\n\u001b[1;32m---> 88\u001b[0m solution \u001b[38;5;241m=\u001b[39m \u001b[43mtest_1layer\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[1], line 2\u001b[0m, in \u001b[0;36mtest_1layer\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtest_1layer\u001b[39m():\n\u001b[1;32m----> 2\u001b[0m frequency \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241m.\u001b[39mpi \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m2.\u001b[39m \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m86400.\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m7.5\u001b[39m)\n\u001b[0;32m 4\u001b[0m radius_array \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mlinspace(\u001b[38;5;241m0.\u001b[39m, \u001b[38;5;241m6000.0e3\u001b[39m, \u001b[38;5;241m100\u001b[39m)\n\u001b[0;32m 5\u001b[0m indices_by_layer \u001b[38;5;241m=\u001b[39m radius_array \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.\u001b[39m\n", - "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Result Success: True\n", + "Result Message: RadialSolver.ShootingMethod:: completed without any noted issues.\n", + "\n", + "Shape: (6, 100).\n" + ] + }, + { + "data": { + "image/png": "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kuDn54e0tDRLm1atWiEoKMjSpn379ti9ezdOnz7toldD3oT5TeQbmOult2fPHlSuXBk333wzevTogUOHDukOyS2wGHehEydOoLCwEFFRUVa3R0VFISMjQ1NUnqXo71TS3zAjIwOVKlWyuj8gIAAVKlSwalPcNq58DiJ7ML+JfANzvXQSEhIwY8YMLFmyBP/5z3+wf/9+tGzZEmfOnNEdmnYBugMgIiIiIu927733WtYbNmyIhIQEVK9eHXPmzEG/fv00RqYfj4y7UGRkJPz9/ZGZmWl1e2ZmJqKjozVF5VmK/k4l/Q2jo6OvOommoKAAp06dsmpT3DaufA4iezC/iXwDc90xTCYTateujb179+oORTsW4y4UFBSExo0bY9myZZbbzGYzli1bhsTERI2ReY7Y2FhER0db/Q1zc3ORlpZm+RsmJiYiOzsbGzdutLRZvnw5zGYzEhISLG1WrVqFS5cuWdosXboUderUwQ033OCiV0PehPlN5BuY645x9uxZ/PXXX4iJidEdin66zyD1NcnJyWI0GmXGjBmSnp4uAwYMEJPJJBkZGbpDcxtnzpyRTZs2yaZNmwSATJgwQTZt2iQHDx4UEZExY8aIyWSSBQsWyNatW6VLly4SGxsrFy5csGyjQ4cOEh8fL2lpabJmzRqpVauWdO/e3XJ/dna2REVFSc+ePWX79u2SnJws5cqVk08//dTlr5e8B/O79K6X90TuhLluv1deeUVWrFgh+/fvl5SUFElKSpLIyEjJysrSHZp2LMY1mDx5slSrVk2CgoKkWbNmsm7dOt0huZXffvtNAFx16d27t4io4Q2HDx8uUVFRYjQapW3btrJ7926rbZw8eVK6d+8uoaGhEh4eLn379pUzZ85YtdmyZYu0aNFCjEajVKlSRcaMGeOql0hejPldOtfLeyJ3w1y3z6OPPioxMTESFBQkVapUkUcffVT27t2rOyy3YBAR0XNMnoiIiIjIt7HPOBERERGRJizGiYiIiIg0YTFORERERKQJi3EiIiIiIk1YjBMRERERacJinIiIiIhIExbjRERERESasBgnIiIiIq+watUqdOrUCZUrV4bBYMD8+fOd+nw1atSAwWC46vLss8/avA0W40RERETkFc6dO4e4uDhMmTLFJc+3fv16HDt2zHJZunQpAKBr1642b4PFOPmU7OxsNGnSBI0aNUL9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XcX4hg0brE4Af/nllwEAvXv3xowZM4p9zA8//IBmzZpZzeNB18Zi3EdcK1EXLFiA2rVro3bt2mUuxgGgTp06WL58ueUI+QcffIAJEybgqaeewv3334/w8HAMHjwYhw8fLrH7CROZyDbJycl47rnnULNmTavbz507B7PZjLCwMJw9exbLly9Ht27d7Np2eHg4kpOTrW7r3bu31fUVK1Zc9bh/ztD3zza1a9dGampqiW0MBgNefPFFvPjii8XGduutt2LJkiV230fkja71OdC0aVNkZWXh9OnTiIiIwKpVqzBw4EC7tn29PtjFsWXwBaD4z4/i5h3w9mFJWYz7iGsl6rp165CcnIy5c+fi7NmzuHTpEsLDwy1nHdvin8l06623Wk2kExYWZtVf9dy5cxg1alSJXVCYyETXZjabcfz4cXz++efYs2cPFixYcFWbzMxMyyQdhYWF6N+//zXH6y8ydepUfPbZZ0hNTfXqUYaeeuopfPXVV7rDICoTWz4HAgIC8N5776FVq1YQEbRr184y2tm1OOJzoEWLFujevXupHns93pi/BmGV4rWuTNSpU6ciPT0d4eHh12w/Y8YMbN++vcTRVNq0aYO1a9ciKCjI5kTdtGkTdu3ahWbNmiEnJwdvvfUWVqxYgb17917zyPfYsWPRvXv3YicDcaaiJD937hy+//57PPDAAy59fiJbrFixAnfffTfq1q2L6dOnIyEhoczbPHr0KC5cuAAAqFatGoKCgsq8TXeVlZWF3NxcAKoLT/ny5TVHRGQ/X/0c8Mb8ZTHuxexNVFuK8dIk6qZNm/Dkk09i9+7dCAoKQuPGjTFhwgS3PPLmjUlORERE7ovFOBERERGRJhxnnIiIiIhIExbjRERERESasBgnIiIiItKExTgRERERkSYsxomIiIiINGExTkRERESkCYtxIiIiIiJNWIwTEREREWnCYpyIiIiISBMW40REREREmrAYJyIiIiLShMU4EREREZEmLMaJiIiIiDRhMU5EREREpAmLcSIiIiIiTViMExERERFpwmKciIiIiEgTFuNERERERJqwGCciIiIi0oTFOBERERGRJizGiYiIiIg0YTFORERERKQJi3EiIiIiIk1YjBMRERERacJinIiIiIhIExbjRERERESasBgnIiIiItKExTgRERERkSYsxomIiIiINGExTkRERESkCYtxIiIiIiJNWIwTEREREWnCYpyIiIiISBMW40REREREmrAYJyIiIiLShMU4EREREZEmLMaJiIiIiDRhMU5EREREpAmLcSIiIiIiTViMExERERFpwmKciIiIiEgTFuNERERERJqwGCciIiIi0oTFOBERERGRJizGiYiIiIg0YTFORERERKQJi3EiIiIiIk1YjBMRERERacJinIiIiIhIExbjRERERESasBgnIiIiItKExTgRERERkSYsxomIiIiINGExTkRERESkCYtxIiIiIiJNWIwTEREREWnCYpyIiIiISJMA3QEQEZF3MJvNyM/P1x2G2wgMDIS/v7/uMIjIzbEYJyKiMsvPz8f+/fthNpt1h+JWTCYToqOjYTAYdIdCRG6KxTgREZWJiODYsWPw9/dH1apV4efHHpAigvPnzyMrKwsAEBMTozkiInJXLMaJiKhMCgoKcP78eVSuXBnlypXTHY7bCAkJAQBkZWWhUqVK7LJCRMXi4QsiIiqTwsJCAEBQUJDmSNxP0ZeTS5cuaY6EiNwVi3EiInII9ou+Gv8mRHQ9LMaJiIiIiDRhMU5EREREpAmLcSIiIhuICEaMGIGYmBiEhIQgKSkJe/bs0R0WEXk4FuNEREQ2GDt2LD766CN88sknSEtLQ/ny5dG+fXtcvHhRd2hE5MFYjBMRkc+ZOXMmbrzxRuTl5Vnd/sADD6Bnz55XtRcRfPjhhxg2bBi6dOmChg0bYubMmfj7778xf/58F0VNRN6IxTgRETmUCHDunJ6LiG0xdu3aFYWFhVi4cKHltqysLCxatAhPPPHEVe3379+PjIwMJCUlWW6LiIhAQkICUlNTy/w3IyLfxUl/iIjIoc6fB0JD9Tz32bNA+fLXbxcSEoLHHnsM06dPR9euXQEAX331FapVq4Y2bdpc1T4jIwMAEBUVZXV7VFSU5T4iotLgkXEiIvJJ/fv3xy+//IKjR48CAGbMmIE+ffpg1qxZCA0NtVxWr16tOVIi8mY8Mk5ERA5Vrpw6Qq3ruW0VHx+PuLg4zJw5E+3atcOOHTuwaNEimEwmJCQkWNpVqVIFx44dAwBkZmYiJibGcl9mZiYaNWrkqPCJyAexGCciIocyGGzrKuIOnnzySXz44Yc4evQokpKSULVqVQBAWFiYVbvY2FhER0dj2bJlluI7NzcXaWlpePrpp10dNhF5EXZTISIin/XYY4/hyJEjmDZtWrEnbhYxGAx46aWX8M4772DhwoXYtm0bevXqhcqVK+OBBx5wXcBE5HV4ZJyIiHxWREQEHn74YSxatOi6RfXgwYNx7tw5DBgwANnZ2WjRogWWLFmC4OBg1wRLRF6JxTgREfm0o0ePokePHjAajSW2MxgMeOutt/DWW2+5KDIi8gUsxomIyCedPn0aK1aswIoVKzB16lTd4RCRj2IxTkREPik+Ph6nT5/G+++/jzp16ugOh4h8FItxIiLySQcOHNAdAhERR1MhIiIiItKFxTgRETmEiOgOwe3wb0JE18NinIiIysTf3x8AkJ+frzkS93P+/HkAQGBgoOZIiMhdsc84ERGVSUBAAMqVK4fjx48jMDAQfn48ziMiOH/+PLKysmAymSxfWIiI/skg/A2NiIjKKD8/H/v374fZbNYdilsxmUyIjo6GwWDQHQoRuSkW40RE5BBms5ldVa4QGBjII+JEdF0sxomIiIiINGHHPiIiIiIiTViMExERERFpwmKciIiIiEgTFuNERERERJqwGCciIiIi0oTFOBERERGRJizGiYiIiIg0+X/WSozMFu5YZwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1.199040866595169e-12+1.8735013540549517e-14j)\n", + "[0.65847646-0.03056421j 0.19123156-0.00916519j 0.03061239-0.00072309j]\n" ] } ], @@ -205,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "id": "9936e5b9-0a7a-4c77-bdc7-dc1bd04030e9", "metadata": {}, "outputs": [ @@ -213,14 +179,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "Result Success: True\n", - "Result Message: RadialSolver.ShootingMethod:: completed without any noted issues.\n", + "Result Success: False\n", + "Result Message: RadialSolver.ShootingMethod:: Integration failed:\n", + "\tError in step size calculation:\n", + "\tRequired step size is less than spacing between numbers..\n", "\n" ] }, + { + "ename": "TypeError", + "evalue": "'NoneType' object is not subscriptable", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[4], line 102\u001b[0m\n\u001b[0;32m 87\u001b[0m yplot([ys], [radius_array], colors\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 90\u001b[0m \u001b[38;5;66;03m# New\u001b[39;00m\n\u001b[0;32m 91\u001b[0m \u001b[38;5;66;03m# 0.5.3\u001b[39;00m\n\u001b[0;32m 92\u001b[0m \u001b[38;5;66;03m# 3.84ms; 3.91ms\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 99\u001b[0m \u001b[38;5;66;03m# New: 2.38ms; 2.41ms; 2.38ms\u001b[39;00m\n\u001b[0;32m 100\u001b[0m \u001b[38;5;66;03m# Old: 100ms; 97.8ms; 95.8ms\u001b[39;00m\n\u001b[1;32m--> 102\u001b[0m \u001b[43mtest_2layer\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[4], line 87\u001b[0m, in \u001b[0;36mtest_2layer\u001b[1;34m()\u001b[0m\n\u001b[0;32m 84\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mResult Success:\u001b[39m\u001b[38;5;124m\"\u001b[39m, solution\u001b[38;5;241m.\u001b[39msuccess)\n\u001b[0;32m 85\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mResult Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, solution\u001b[38;5;241m.\u001b[39mmessage)\n\u001b[1;32m---> 87\u001b[0m \u001b[43myplot\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mys\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mradius_array\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mb\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\anaconda3\\envs\\tpy6py311\\Lib\\site-packages\\TidalPy\\utilities\\graphics\\multilayer\\yplot.py:95\u001b[0m, in \u001b[0;36myplot\u001b[1;34m(tidal_ys, radius, depth_plot, planet_radius, colors, labels, show_plot, use_tobie_limits, plot_tobie, plot_roberts)\u001b[0m\n\u001b[0;32m 93\u001b[0m num_y \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m array_num, (radius_array, tidal_y_array) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mzip\u001b[39m(radius, tidal_ys)):\n\u001b[1;32m---> 95\u001b[0m y1 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mreal(\u001b[43mtidal_y_array\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[0;32m 96\u001b[0m y2 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mreal(tidal_y_array[\u001b[38;5;241m1\u001b[39m, :])\n\u001b[0;32m 97\u001b[0m y3 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mreal(tidal_y_array[\u001b[38;5;241m2\u001b[39m, :])\n", + "\u001b[1;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" + ] + }, { "data": { - "image/png": "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aNmyJfbt26c7A75w4UIsWrQIISEheP7556FWqzFt2jRcvXq11OYkTHwiaePGjRg/fjyaN2+ud39WVhYKCgpQs2ZN3L59G/v27cPgwYPLtW+1Wo2NGzfq3Tdy5Ei927GxsUUe9/AMeQ9v06JFC8THx5e6jUqlwoQJEzBhwoRiY2vdujV27txZ7nVElqikPO/cuTPS09Nx8+ZNuLi44MCBA/i///u/cu37UW2ki1OWwQ6A4v8/FDeuP4cBfTQW31aopMT++eefsXHjRkRFReH27dvIzc2FWq3W9Roui4eTr3Xr1noT19SsWVOvPWpWVhbmzJlTapMSJj5VZQUFBfjzzz/xxRdf4MKFC9i6dWuRbdLS0nSTZuTn5+P1118vcTz8QitWrMDq1asRHx9v1aP8hISEYP369UqHQVSqsuR5tWrV8MEHH6B79+4QQiAgIEA3mlhJDJHnTz/9NIYOHVqhxz4K87N4KsFKxSo8mNgrVqzAuXPnoFarS9w+MjISZ86cKXW0E39/fxw6dAj29vZlTuyTJ0/i119/xRNPPIHMzEzMnTsXsbGxuHjxYolnthcsWIChQ4cWOzmHMRX+U8jKysKWLVvQv39/kz4/ESC/VD777LNo1aoV1qxZgy5dulR6n3/88Qfu3r0LAPDy8oK9vX2l92mu0tPTodVqAcgmOU5OTgpHRFRUVc1z5mfxWHxbifImdlmK74ok9smTJzFmzBicP38e9vb26NSpExYtWmSWZ974T4GIiIhMjcU3EREREZGJcJxvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITYfFNRERERGQiLL6JiIiIiEyExTcRERERkYmw+CYiIiIiMhEW30REREREJsLim4iIiIjIRFh8ExERERGZCItvIiIiIiITqaZ0AEREZHkKCgqQk5OjdBhmw87ODra2tkqHQUQWgMU3ERGVS05ODpKSklBQUKB0KGbF1dUVHh4eUKlUSodCRGaMxTcREZWZEAIpKSmwtbVFo0aNYGPD1otCCNy5cwfp6ekAAE9PT4UjIiJzxuKbiIjKLC8vD3fu3EH9+vXh6OiodDhmo0aNGgCA9PR01KtXj01QiKhEPGVBRERllp+fDwCwt7dXOBLzU/hlJDc3V+FIiMicsfgmIqJyY7vmovieEFFZsPgmIiIiIjIRFt9ERERERCbC4puIiOghQgjMmjULnp6eqFGjBnr16oULFy4oHRYRWQEW30RERA9ZsGABPv74Y6xatQqHDx+Gk5MTAgMDce/ePaVDIyILx+KbiIis2rp16+Dm5obs7Gy9+/v374/hw4cX2V4IgSVLlmDmzJno168f2rVrh3Xr1uH69ev47rvvTBQ1EVkrFt9ERFRhQgBZWcosQpQtxkGDBiE/Px/ff/+97r709HRER0dj9OjRRbZPSkpCamoqevXqpbvPxcUFXbp0QXx8fKXfMyKq2jjJDhERVdidO4CzszLPffs24OT06O1q1KiBl19+GWvWrMGgQYMAAOvXr4eXlxf8/f2LbJ+amgoAcHd317vf3d1dt46IqKJ45puIiKze66+/jt27d+OPP/4AAERGRuLVV1/Fhg0b4OzsrFt+/PFHhSMlImvHM99ERFRhjo7yDLRSz11WHTp0gJ+fH9atW4eAgACcPXsW0dHRcHV1RZcuXXTbNWjQACkpKQCAtLQ0eHp66talpaWhffv2hgqfiKooFt9ERFRhKlXZmn6YgzFjxmDJkiX4448/0KtXLzRq1AgAULNmTb3tvL294eHhgb179+qKba1Wi8OHD2PcuHGmDpuIrAybnRARUZXw8ssv49q1a/j888+L7WhZK2Y+BAAAAaxJREFUSKVSYeLEiXjvvffw/fff4/Tp0xgxYgTq16+P/v37my5gIrJKPPNNRERVgouLC4KDgxEdHf3IInratGnIysrC2LFjkZGRgaeffho7d+5E9erVTRMsEVktFt9ERFRl/PHHHxg2bBgcHBxK3U6lUmHu3LmYO3euiSIjoqqCxTcREVm9mzdvIjY2FrGxsVixYoXS4RBRFcbim4iIrF6HDh1w8+ZN/Oc//0HLli2VDoeIqjAW30REZPWuXLmidAhERAA42gkRERERkcmw+CYionITQigdgtnhe0JEZcHim4iIyszW1hYAkJOTo3Ak5ufOnTsAADs7O4UjISJzxjbfRERUZtWqVYOjoyP+/PNP2NnZwcaG53CEELhz5w7S09Ph6uqq+4JCRFQcleDvZEREVA45OTlISkpCQUGB0qGYFVdXV3h4eEClUikdChGZMRbfRERUbgUFBWx68gA7Ozue8SaiMmHxTURERERkImysR0RERERkIiy+iYiIiIhMhMU3EREREZGJsPgmIiIiIjIRFt9ERERERCbC4puIiIiIyERYfBMRERERmcj/A8dDp0T9szsvAAAAAElFTkSuQmCC", + "image/png": "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QyQPM0NkeibbsgkACQkJiI2NRcuWLREeHo7Zs2ejoKAAcXFxAICBAwfC398fSUlJAIDu3btj5syZaNGiBSIiInDixAmMHz8e3bt3l14IiKwdc0MkDzNDZFombTb79u2LS5cuYcKECcjOzkbz5s2xYcMG6UDus2fPan26fP/996FSqfD+++/j/Pnz8PLyQvfu3TF58mRTPQQio2NuiORhZohMSyUesX0C+fn5cHNzQ15eHlxdXU1dDlGFzGVdNZc6iB7EnNZVc6qFqDLGWFct6tvoRERERGRZ2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLYbBIRERGRYthsEhEREZFi2GwSERERkWLs9Bn02WefyV5wXFwcXFxcZM9HZA2YGSJ5mBki66USQogHDbKxsUGtWrVga2ur10KzsrJw7Ngx1KlT56ELNLT8/Hy4ubkhLy8Prq6upi6HrJQhMmMu66q51EHWzZoyY261EFXGGOuqXls2AWD37t3w9vbWayw/aRIxM0RyMTNE1kmvYzYnTpwIZ2dnvRf67rvvonr16lUuisjSMTNE8jAzRNZLr93o1oS7NshSmMu6ai51ED2IOa2r5lQLUWWMsa7y2+hEREREpBi9j9ksc+XKFUyYMAGbN2/GxYsXUVpaqnX71atXDVYckTVgZojkYWaIrIvsZnPAgAE4ceIEhgwZAh8fH6hUKiXqIrIazAyRPMwMkXWR3Wz+9ddf+Pvvv9GsWTMl6iGyOswMkTzMDJF1kX3MZqNGjXDr1i0laiGySswMkTzMDJF1kd1szps3D++99x7+/PNPXLlyBfn5+VoXuZKTkxEcHAwHBwdERERg165dlY7Pzc1FfHw8atasCY1GgwYNGmD9+vWy75fIWAydGYC5IevGzBBZF9m70d3d3ZGfn4+OHTtqTRdCQKVSoaSkRO9l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Y1216G+jExEREZF5Y7NJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIphs0lEREREimGzSURERESKYbNJRERERIoxi2YzOTkZwcHBcHBwQEREBHbt2lXp+GXLlqFRo0ZwcHBASEgI1q9fb6RKicwDM0MkDzNDZDombzaXLFmChIQETJw4EXv27EGzZs0QExODixcv6hy/fft29O/fH0OGDMHevXvRs2dP9OzZEwcOHDBy5USmwcwQycPMEJmYMLHw8HARHx8vXS8pKRF+fn4iKSlJ5/g+ffqIbt26aU2LiIgQI0aM0Ov+8vLyBACRl5dX9aKJjKCidZWZIdLNXDJTWS1E5sYY66qdKRvdoqIiZGRkIDExUZpmY2OD6OhopKen65wnPT0dCQkJWtNiYmKwatUqneMLCwtRWFgoXc/LywMA5OfnP2T1RMoqW0eFENI0ZoaoYqbKDMDckOXSlRtDM2mzefnyZZSUlMDHx0druo+PD44cOaJznuzsbJ3js7OzdY5PSkrCpEmTyk0PCAioYtVExnXlyhW4ubkBYGaI9GHszADMDVm+e3NjaCZtNo0hMTFR6xNqbm4ugoKCcPbsWcWeVEPJz89HQEAAsrKy4OrqaupyKmUptVpKncDdLSOBgYGoXr26Ue+XmTEO1mp4psoMYLm5sZS/LcBalWKM3Ji02fT09IStrS1ycnK0pufk5MDX11fnPL6+vrLGazQaaDSactPd3NzMfgUo4+rqyloNzFLqBO7u8ivDzOjHkv6+rNXwjJ0ZwPJzYyl/W4C1KuXe3Bh82YotWQ9qtRphYWFIS0uTppWWliItLQ2RkZE654mMjNQaDwCp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yclB8+bNkZ2djbCwMBw7dgxOTk6Vru/32r59Ozp06IDAwEDExsbC19cXWVlZ2LFjB06ePIkTJ05IY52dnfHCCy/wA5Ihyf6Vd1JEfHy8MIc/R1RUlAAgAIi9e/c+cPyrr74q7OzsxOnTp4UQQoSGhoqzZ88KIYTIycnRGtukSRMRFRWlVx03btyQVXdsbKxU98qVK2XN+yg7ceKEcHJyEo899pj477//yt1+584dMWfOHOlvWhG5fy9DSklJEQDE//73P63pCQkJAoD46aefZC2vsvVUVz6ioqLE66+/XoXKlcn95s2bBQCxefPmSsfNnTtXABCpqanStHtzlJCQ8NC1FBQUCCHkZV9fpaWl4ubNm0IIIQCI+Ph4gy7fXBlzfTe0svVd7vvM/e59n9F3fe/atavw8vIS165dK3fb/e9VTk5OIjY2ttw4Xe8zpnztsyTcjW7GUlJS0LFjR3h7e0Oj0aBx48b44osvyo0LDg7GM888g7///hvh4eFwcHBAnTp18N1335Ub+88//yAqKgqOjo6oVasWPv74Y6SkpEClUuH06dMAgGHDhuHChQto2rTpA2s8efIkatWqhaCgIGRkZKCkpAQBAQEAAG9vb60aDx48iD///FPa/VO2paxst9Cff/6JV199Fd7e3qhVq5Y072+//Ya2bdvCyckJLi4u6NatGw4ePKhVx7vvvou+ffsCAHr37o2aNWuiR48e0mMCgN27dyMmJgaenp5wdHRE7dq1MXjw4Ac+Rms2ffp0FBQUICUlBTVr1ix3u52dHV577TXpbwoAgwYNgrOzM06ePImuXbvCxcUFL730EgDgr7/+Qu/evREYGAiNRoOAgACMHTsWt27dkuafMWMGVCoVzpw5U+7+EhMToVarce3atYd+bB07dgRw9xABACguLsZHH32EunXrQqPRIDg4GO+++y4KCwuleXStp/duLSkuLkbTpk3h5+eHiIgI1KtXD2fPntXaUnP69GmoVCrMmDEDX3/9tXR/TzzxBP73v/9pPY/JyckAtA+rKVN2DFtcXBzef/99nDlzBq+++ioaNmwIR0dH1KhRA71799Zax/WRm5uLZs2aISEhAQDg7u4u3TZnzhxp78q9u2R/+OEHhIWFwdHREdWrV0e/fv2QlZWltdz27dujadOmyMjIQLt27VCtWjW8++67lT6nH3zwgdZjLlP2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zSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKYbNJhEREREphs0mERERESmGzSYRERERKcZOn0GfffaZ7AXHxcXBxcVF9nxE1oCZIZKHmSGyXiohhHjQIBsbG9SqVQu2trZ6LTQrKwvHjh1DnTp1HrpAQ8vPz4ebmxvy8vLg6upq6nLIShkiM+ayrppLHWTdrCkz5lYLUWWMsa7qtWUTAHbv3g1vb2+9xvKTJhEzQyQXM0NknfQ6ZnPixIlwdnbWe6HvvvsuqlevXuWiiCwdM0MkDzNDZL302o1uTbhrgyyFuayr5lIH0YOY07pqTrUQVcYY6yq/jU5EREREitH7mM0yV65cwYQJE7B582ZcvHgRpaWlWrdfvXrVYMURWQNmhkgeZobIushuNgcMGIATJ05gyJAh8PHxgUqlUqIuIqvBzBDJw8wQWRfZzeZff/2Fv//+G82aNVOiHiKrw8wQycPMEFkX2cdsNmrUCLdu3VKiFiKrxMwQycPMEFkX2c3mvHnz8N577+HPP//ElStXkJ+fr3WRKzk5GcHBwXBwcEBERAR27dpV6fjc3FzEx8ejZs2a0Gg0aNCgAdavXy/7fomMxdCZAZgbsm7MDJF1kb0b3d3dHfn5+ejYsaPWdCEEVCoVSkpK9F7WkiVLkJCQgC+//BIRERGYPXs2YmJicPToUZ0n9i0qKkLnzp3h7e2N5cuXw9/fH2fOnIG7u7vch0FkNIbMDMDckPVjZoisi+zzbIaHh8POzg6vv/66zgO3o6Ki9F5WREQEnnjiCXz++ecAgNLSUgQEBGD06NEYN25cufFffvklPvnkExw5cgT29vZyypbw3GdkbFXNTEXrqrFzw8yQsVl6ZiqrhcjcmNXPVZY5cOAA9u7di4YNGz7UHRcVFSEjIwOJiYnSNBsbG0RHRyM9PV3nPGvWrEFkZCTi4+OxevVqeHl54cUXX8Q777xT4e/pFhYW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7Pz589G2bVt4eHjAw8MD0dHRlY4nskbMDJE8zAyR6Zi82VyyZAkSEhIwceJE7NmzB82aNUNMTAwuXryoc/yWLVvQv39/bN68Genp6QgICECXLl1w/vx5I1dOZBrMDJE8zAyRiQkTCw8PF/Hx8dL1kpIS4efnJ5KSkvSav7i4WLi4uIhFixbpNT4vL08AEHl5eVWql8hYKlpXmRki3cwlM5XVQmRujLGumnTLZlFRETIyMhAdHS1Ns7GxQXR0NNLT0/Vaxs2bN3Hnzh1Ur15d5+2FhYXIz8/XuhBZKmaGSB5jZAZgbogqY9Jm8/LlyygpKYGPj4/WdB8fH2RnZ+u1jHfeeQd+fn5aLyT3SkpKgpubm3QJCAh46LqJTIWZIZLHGJkBmBuiypj8mM2HMXXqVCxevBgrV66Eg4ODzjGJiYnIy8uTLllZWUauksh8MDNE8uiTGYC5IaqMnSnv3NPTE7a2tsjJydGanpOTA19f30rnnTFjBqZOnYpNmzYhNDS0wnEajQYajcYg9RKZGjNDJI8xMgMwN0SVMemWTbVajbCwMKSlpUnTSktLkZaWhsjIyArnmz59Oj766CNs2LABLVu2NEapRGaBmSGSh5khMj2TbtkEgISEBMTGxqJly5YIDw/H7NmzUVBQgLi4OADAwIED4e/vj6SkJADAtGnTMGHCBPz0008IDg6WjrlxdnaGs7OzyR4HkbEwM0TyMDNEpmXyZrNv3764dOkSJkyYgOzsbDRv3hwbNmyQDuY+e/YsbGz+bwPsF198gaKiIrzwwgtay5k4cSI++OADY5ZOZBLMDJE8zAyRaamEEMLURRhTfn4+3NzckJeXB1dXV1OXQ1Qhc1lXzaUOogcxp3XVnGohqowx1lWL/jY6EREREZk3NptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RERESkGDabRERERKQYNptEREREpBg2m0RE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", "text/plain": [ "
" ] @@ -232,11 +213,10 @@ "source": [ "def test_2layer():\n", " layer_types = ('liquid', 'solid')\n", - " is_solid_by_layer = (False, True)\n", " is_static_by_layer = (False, False)\n", - " integration_method = 'DOP853'\n", - " integration_rtol = 1.0e-6\n", - " integration_atol = 1.0e-12\n", + " integration_method = 'RK45'\n", + " integration_rtol = 1.0e-8\n", + " integration_atol = 1.0e-10\n", " nondimensionalize = False\n", " is_incompressible_by_layer = (False, False)\n", " use_kamata = False\n", @@ -245,7 +225,7 @@ " CMB_radius = 0.4 * radius_array[-1]\n", " upper_radius_by_layer = np.asarray((CMB_radius, radius_array[-1]))\n", " \n", - " frequency = np.pi * 2. / (86400. * 1.0)\n", + " frequency = np.pi * 2. / (86400. * 0.3)\n", " \n", " ic_index = radius_array <= CMB_radius\n", " mantle_index = radius_array > CMB_radius\n", @@ -285,13 +265,13 @@ " solve_for = None,\n", " core_condition = 0,\n", " use_kamata = use_kamata,\n", - " starting_radius = 2.0e6,\n", + " starting_radius = 0.1,\n", " start_radius_tolerance = 1.0e-5,\n", " integration_method = integration_method,\n", " integration_rtol = integration_rtol,\n", " integration_atol = integration_atol,\n", " scale_rtols_by_layer_type = False,\n", - " max_num_steps = 500_000,\n", + " max_num_steps = 5_000_000,\n", " expected_size = len(radius_array),\n", " max_ram_MB = 1500,\n", " max_step = 0,\n", @@ -372,7 +352,6 @@ "source": [ "def test_3layer():\n", " layer_types = ('solid', 'liquid', 'solid')\n", - " is_solid_by_layer = (True, False, True)\n", " is_static_by_layer = (False, False, False)\n", " integration_method = 'RK45'\n", " integration_rtol = 1.0e-8\n", @@ -517,7 +496,6 @@ "source": [ "def test_4layer():\n", " layer_types = ('solid', 'solid', 'liquid', 'solid')\n", - " is_solid_by_layer = (True, True, False, True)\n", " is_static_by_layer = (False, False, False, False)\n", " integration_method = 'RK45'\n", " integration_rtol = 1.0e-12\n", diff --git a/TODO.md b/TODO.md index 900519e6..8e7d41c1 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,7 @@ v0.6.0: * Add in dm/dr and dI/dr (total mass and MOI) to EOS solver. +* Create issue for higher precision. Look around line 548 in RadialSolver.odes.pyx * Tests: * radial_solver when starting_radius is provided. when it is not. when it is provided and its very large relative to planet (ensure nans are being produced at lower layers) diff --git a/Tests/Cython experiments.ipynb b/Tests/Cython experiments.ipynb index 846f7b8a..8283d16f 100644 --- a/Tests/Cython experiments.ipynb +++ b/Tests/Cython experiments.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "10773e77", "metadata": {}, "outputs": [], @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "bcdcc775", "metadata": {}, "outputs": [ @@ -20,7 +20,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "3.0.8\n" + "3.0.11\n" ] } ], @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "1c7d9516", "metadata": {}, "outputs": [], @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "cd4a8205", "metadata": {}, "outputs": [ @@ -52,828 +52,16 @@ "Error compiling Cython file:\n", "------------------------------------------------------------\n", "...\n", - "from libc.math cimport pi\n", - "\n", - "from cython.parallel cimport prange\n", - "\n", - "from TidalPy.utilities.constants_x cimport G\n", - "from TidalPy.utilities.math.complex cimport cf_cinv\n", - "^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:421:0: 'TidalPy\\utilities\\math\\complex\\cf_cinv.pxd' not found\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - "cdef int MAX_NUM_Y = 6\n", - "\n", - "\n", - "cdef void cf_matrix_propagate(\n", - " RadialSolutionStorageCC* solution_storage_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:779:8: 'RadialSolutionStorageCC' is not a type identifier\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " RadialSolutionStorageCC* solution_storage_ptr,\n", - " size_t total_slices,\n", - " double* radius_array_ptr,\n", - " double frequency,\n", - " double planet_bulk_density,\n", - " EOSSolutionVec* eos_solution_bylayer_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:784:8: 'EOSSolutionVec' is not a type identifier\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Nondimensional variables\n", - " cdef double mean_radius = radius_array_ptr[total_slices - 1]\n", - " cdef double planet_radius_to_use = NAN\n", - " cdef double bulk_density_to_use = NAN\n", - " cdef double frequency_to_use = NAN\n", - " cdef double G_to_use = NAN\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:866:16: 'G_to_use' redeclared \n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # int* is_static_by_layer_ptr,\n", - " # int* is_incompressible_by_layer_ptr,\n", - " double* upper_radius_by_layer_ptr,\n", - " size_t num_bc_models,\n", - " int* bc_models_ptr,\n", - " double G_to_use = G,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:793:8: Previous declaration is here\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " ):\n", - "\n", - " cdef size_t num_radius = radius_array_view.size\n", - " cdef double radius_planet_to_use, bulk_density_to_use, frequency_to_use, G_to_use\n", - " \n", - " cf_redimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:286:33: no suitable method found\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:17: 'cf_cinv' is not a constant, variable or function identifier\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Propagator Matrix Method Called.\\n\")\n", - "\n", - " # Create gravity and density arrays used to build the matrices\n", - " cdef vector[double] density_array_vec = vector[double](0)\n", - " cdef vector[double] gravity_array_vec = vector[double](0)\n", - " cdef vector[double complex] complex_shear_array_vec = vector[double](0)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:811:72: Cannot assign type 'vector[double]' to 'vector[double complex]'\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Create gravity and density arrays used to build the matrices\n", - " cdef vector[double] density_array_vec = vector[double](0)\n", - " cdef vector[double] gravity_array_vec = vector[double](0)\n", - " cdef vector[double complex] complex_shear_array_vec = vector[double](0)\n", - " # TODO: Bulk modulus is not used in the propagation matrix method.\n", - " cdef vector[double complex] complex_bulk_array_vec = vector[double](0)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:813:72: Cannot assign type 'vector[double]' to 'vector[double complex]'\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:24: Object of type 'CySolverResult' has no attribute 'cyresult_ptr'\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:46: Cannot convert 'double *' to Python object\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double bulk_density_to_use = NAN\n", - " cdef double frequency_to_use = NAN\n", - " cdef double G_to_use = NAN\n", - "\n", - " if nondimensionalize and (not already_nondimed):\n", - " cf_non_dimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:869:39: Call with wrong number of arguments (expected 12, got 13)\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Various index shifts\n", - " cdef size_t ytype_shift\n", - " cdef size_t solution_slice_ishift\n", - "\n", - " # Build solution\n", - " cdef double* solution_dbl_ptr = solution_storage_ptr.full_solution_ptr\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1119:56: Cannot convert Python object to 'double *'\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, bulk_modulus_ptr, complex_shear_modulus_array_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1202:31: undeclared name not builtin: bulk_modulus_ptr\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, bulk_modulus_ptr, complex_shear_modulus_array_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1202:49: undeclared name not builtin: complex_shear_modulus_array_ptr\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Redimensionalize\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1200:37: Call with wrong number of arguments (expected 12, got 13)\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - "\n", - " # Set solution status\n", - " solution_storage_ptr.success = not error\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1226:24: Assignment of Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " ):\n", - "\n", - " cdef size_t num_radius = radius_array_view.size\n", - " cdef double radius_planet_to_use, bulk_density_to_use, frequency_to_use, G_to_use\n", - " \n", - " cf_redimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:286:4: Invalid use of fused types, type cannot be specialized\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double bulk_density_to_use = NAN\n", - " cdef double frequency_to_use = NAN\n", - " cdef double G_to_use = NAN\n", - "\n", - " if nondimensionalize and (not already_nondimed):\n", - " cf_non_dimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:869:8: Invalid use of fused types, type cannot be specialized\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Redimensionalize\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1200:8: Invalid use of fused types, type cannot be specialized\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:24: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:24: Calling gil-requiring function not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:17: Accessing Python global or builtin not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:24: Constructing Python tuple not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:506:25: Converting to Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Setup\n", - " cdef size_t r_i, i, j, k, jj, ytype_i, slice_i\n", - " cdef size_t last_index_shift_36, index_shift_36, last_index_shift_18, index_shift_18, index_shift_max_y, full_shift\n", - " cdef cpp_bool error = False\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Propagator Matrix Method Called.\\n\")\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:806:31: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Setup\n", - " cdef size_t r_i, i, j, k, jj, ytype_i, slice_i\n", - " cdef size_t last_index_shift_36, index_shift_36, last_index_shift_18, index_shift_18, index_shift_max_y, full_shift\n", - " cdef cpp_bool error = False\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Propagator Matrix Method Called.\\n\")\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:806:31: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:42: Discarding owned Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:42: Calling gil-requiring function not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:37: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:24: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:42: Constructing Python tuple not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:43: Converting to Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:852:46: Converting to Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " &planet_radius_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " # Ensure that no errors occured during the non-dim process\n", - " if isnan(planet_radius_to_use) or isnan(bulk_density_to_use) or isnan(frequency_to_use) or isnan(G_to_use):\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: NaNs encountered after non-dimensionalize call.\\n\")\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:877:39: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " &planet_radius_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " # Ensure that no errors occured during the non-dim process\n", - " if isnan(planet_radius_to_use) or isnan(bulk_density_to_use) or isnan(frequency_to_use) or isnan(G_to_use):\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: NaNs encountered after non-dimensionalize call.\\n\")\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:877:39: Accessing Python attribute not allowed without gil\n", + "cimport gmpy2\n", + "from gmpy2 cimport import_gmpy2, mpc_t, mpc, GMPy_MPC_New, mpfr_t, MPFR_RNDN\n", + "import_gmpy2()\n", "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Ensure that no errors occured during the non-dim process\n", - " if isnan(planet_radius_to_use) or isnan(bulk_density_to_use) or isnan(frequency_to_use) or isnan(G_to_use):\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: NaNs encountered after non-dimensionalize call.\\n\")\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", + "cdef mpfr_t r \n", + "gmpy2.mpfr_set_d(r, 20., MPFR_RNDN) \n", + " ^\n", "------------------------------------------------------------\n", "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:880:43: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Ensure that no errors occured during the non-dim process\n", - " if isnan(planet_radius_to_use) or isnan(bulk_density_to_use) or isnan(frequency_to_use) or isnan(G_to_use):\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: NaNs encountered after non-dimensionalize call.\\n\")\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:880:43: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " elif (j == 5) and (k == 2):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " else:\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " else:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Unknown starting core conditions encountered in `cf_matrix_propagate`: %d (acceptible values: 0, 1, 2, 3)\\n\", core_condition)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:997:36: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " elif (j == 5) and (k == 2):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " else:\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " else:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Unknown starting core conditions encountered in `cf_matrix_propagate`: %d (acceptible values: 0, 1, 2, 3)\\n\", core_condition)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:997:36: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " else:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Unknown starting core conditions encountered in `cf_matrix_propagate`: %d (acceptible values: 0, 1, 2, 3)\\n\", core_condition)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1000:39: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " else:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Unknown starting core conditions encountered in `cf_matrix_propagate`: %d (acceptible values: 0, 1, 2, 3)\\n\", core_condition)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1000:39: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Various index shifts\n", - " cdef size_t ytype_shift\n", - " cdef size_t solution_slice_ishift\n", - "\n", - " # Build solution\n", - " cdef double* solution_dbl_ptr = solution_storage_ptr.full_solution_ptr\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1119:56: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Various index shifts\n", - " cdef size_t ytype_shift\n", - " cdef size_t solution_slice_ishift\n", - "\n", - " # Build solution\n", - " cdef double* solution_dbl_ptr = solution_storage_ptr.full_solution_ptr\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1119:56: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " bc_solution_info_ptr # (Ouput)\n", - " )\n", - "\n", - " # Check for errors\n", - " if bc_solution_info_ptr[0] != 0:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Error encountered while applying surface boundary condition. ZGESV code: %d \\nThe solutions may not be valid at the surface.\\n\", bc_solution_info)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1154:40: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " bc_solution_info_ptr # (Ouput)\n", - " )\n", - "\n", - " # Check for errors\n", - " if bc_solution_info_ptr[0] != 0:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Error encountered while applying surface boundary condition. ZGESV code: %d \\nThe solutions may not be valid at the surface.\\n\", bc_solution_info)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1154:40: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Check for errors\n", - " if bc_solution_info_ptr[0] != 0:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Error encountered while applying surface boundary condition. ZGESV code: %d \\nThe solutions may not be valid at the surface.\\n\", bc_solution_info)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1157:43: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " # Check for errors\n", - " if bc_solution_info_ptr[0] != 0:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Error encountered while applying surface boundary condition. ZGESV code: %d \\nThe solutions may not be valid at the surface.\\n\", bc_solution_info)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1157:43: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, bulk_modulus_ptr, complex_shear_modulus_array_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1202:31: Accessing Python global or builtin not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, bulk_modulus_ptr, complex_shear_modulus_array_ptr,\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1202:49: Accessing Python global or builtin not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1220:38: Discarding owned Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1220:38: Calling gil-requiring function not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1220:28: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1220:38: Constructing Python tuple not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1220:39: Converting to Python object not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1223:35: Coercion from Python not allowed without the GIL\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1223:35: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - "\n", - " # Set solution status\n", - " solution_storage_ptr.success = not error\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1226:24: Accessing Python attribute not allowed without gil\n", - "\n", - "Error compiling Cython file:\n", - "------------------------------------------------------------\n", - "...\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - "\n", - " # Set solution status\n", - " solution_storage_ptr.success = not error\n", - " ^\n", - "------------------------------------------------------------\n", - "\n", - "C:\\Users\\jrenaud\\.ipython\\cython\\_cython_magic_d889a8f5d245e9eab7194ec749c2c6b58bd68c53.pyx:1226:35: Converting to Python object not allowed without gil\n" + "C:\\Users\\joepr\\.ipython\\cython\\_cython_magic_a8790da9eb3ed3d63c1ef39be9f1304c67fd789e.pyx:14:5: cimported module has no attribute 'mpfr_set_d'\n" ] } ], @@ -887,1229 +75,14 @@ "\n", "np.import_array()\n", "\n", - "ctypedef fused double_numeric:\n", - " double\n", - " double complex\n", - "\n", - "from libc.stdio cimport printf\n", - "from libc.string cimport memcpy\n", - "from libcpp cimport bool as cpp_bool\n", - "from libcpp.limits cimport numeric_limits\n", - "\n", - "\n", - "from CyRK.utils.memory cimport shared_ptr, make_shared\n", - "from CyRK.utils.vector cimport vector\n", - "from CyRK.array.interp cimport interpj_ptr, interp_ptr, interp_complex_ptr\n", - "from CyRK cimport cysolve_ivp, CySolveOutput, PreEvalFunc, CySolverResult\n", - "\n", - "\n", - "from libc.math cimport NAN, INFINITY\n", - "from libc.float cimport DBL_MAX, DBL_MIN, DBL_MANT_DIG\n", - "\n", - "cdef double complex cmplx_NAN\n", - "cdef double complex cmplx_zero\n", - "cdef double SQRT2\n", - "cdef double LOGE2\n", - "cdef double SQRT2_INV\n", - "cdef double THRESH\n", - "cdef double DBL_MAX_4\n", - "cdef int SCALED_CEXP_K_F\n", - "cdef int SCALED_CEXP_K_D\n", - "cdef int SCALED_CEXP_K_LD\n", - "cdef double SCALED_K_LOGE2_D\n", - "cdef float SCALED_CEXP_LOWERF\n", - "cdef float SCALED_CEXP_UPPERF\n", - "cdef double SCALED_CEXP_LOWER\n", - "cdef double SCALED_CEXP_UPPER\n", - "cdef long double SCALED_CEXP_LOWERL\n", - "cdef long double SCALED_CEXP_UPPERL\n", - "\n", - "from libc.math cimport isfinite, isinf, isnan, copysign, \\\n", - " sqrt, fabs, signbit, exp, cos, sin, log, log1p, ldexp, atan2, frexp, ceil\n", - "\n", - "cdef int DBL_MANT_DIG_INT = DBL_MANT_DIG\n", - "\n", - "SQRT2 = 1.414213562373095048801688724209698079 # sqrt 2\n", - "LOGE2 = 0.693147180559945309417232121458176568 # log_e 2\n", - "\n", - "# We risk spurious overflow for components >= DBL_MAX / (1 + sqrt(2)).\n", - "SQRT2_INV = 1. / (1.0 + SQRT2)\n", - "THRESH = SQRT2_INV * DBL_MAX\n", - "DBL_MAX_4 = 0.25 * DBL_MAX\n", - "\n", - "# scaled_cexp precison constant\n", - "#if @precision@ == 1\n", - "# precision for float\n", - "SCALED_CEXP_K_F = 235\n", - "# precision for double\n", - "SCALED_CEXP_K_D = 1799\n", - "# precision for long double\n", - "SCALED_CEXP_K_LD = 19547\n", - "\n", - "SCALED_K_LOGE2_D = SCALED_CEXP_K_D * LOGE2\n", - "\n", - "SCALED_CEXP_LOWERF = 88.722839\n", - "SCALED_CEXP_UPPERF = 192.69492\n", - "SCALED_CEXP_LOWER = 710.47586007394386\n", - "SCALED_CEXP_UPPER = 1454.9159319953251\n", - "SCALED_CEXP_LOWERL = 11357.216553474703895\n", - "SCALED_CEXP_UPPERL = 22756.021937783004509\n", - "\n", - "\n", - "cdef inline double complex cf_build_dblcmplx(const double a, const double b) noexcept nogil:\n", - " cdef double complex result\n", - " cdef double* result_dbl_ptr = &result\n", - " result_dbl_ptr[0] = a\n", - " result_dbl_ptr[1] = b\n", - "\n", - " return result\n", - "\n", - "cdef double INF_DBL = numeric_limits[double].infinity()\n", - "cdef double PI_DBL = 3.14159265359\n", - "cdef double G = 6.67430e-11\n", - "cdef double NAN_DBL = cmplx_NAN.real\n", - "\"\"\" Propagation of tidal solution using the fundamental matrix\n", - "\n", - "References\n", - "----------\n", - "SVC16 : Sabadini, Vermeerson, & Cambiotti (2016, DOI: 10.1007/978-94-017-7552-6)\n", - "HH14 : Henning & Hurford (2014, DOI: 10.1088/0004-637X/789/1/30)\n", - "ID : IcyDwarf Code by Marc Neveu (https://github.com/MarcNeveu/IcyDwarf/blob/master/IcyDwarf/Thermal.h)\n", - "B13 : Beuthe (2013, DOI: 10.1016/j.icarus.2012.11.020)\n", - "\"\"\"\n", - "\n", - "from libc.math cimport NAN, isnan\n", - "from libc.stdio cimport printf, sprintf\n", - "from libc.stdlib cimport exit, EXIT_FAILURE\n", - "from libc.string cimport strcpy\n", - "\n", - "from scipy.linalg.cython_lapack cimport zgesv\n", - "from CyRK cimport CySolverResult\n", - "from CyRK.utils.utils cimport allocate_mem, free_mem\n", - "\n", - "from TidalPy.constants cimport G\n", - "from libc.math cimport pi, sqrt\n", - "\n", - "\n", - "cdef void cf_non_dimensionalize_physicals(\n", - " size_t num_radius,\n", - " double frequency,\n", - " double mean_radius,\n", - " double bulk_density,\n", - " double* radius_array_ptr,\n", - " double* density_array_ptr,\n", - " double_numeric* bulk_array_ptr,\n", - " double_numeric* shear_array_ptr,\n", - " double* radius_planet_to_use,\n", - " double* bulk_density_to_use,\n", - " double* frequency_to_use,\n", - " double* G_to_use\n", - " ) noexcept nogil:\n", - "\n", - " # Setup loop variables\n", - " cdef size_t i\n", - "\n", - " # Setup conversions\n", - " cdef double second2_conversion, second_conversion, length_conversion\n", - " cdef double density_conversion, mass_conversion, pascal_conversion\n", - " second2_conversion = 1. / (pi * G * bulk_density)\n", - " second_conversion = sqrt(second2_conversion)\n", - " length_conversion = mean_radius\n", - " density_conversion = bulk_density\n", - " mass_conversion = bulk_density * mean_radius**3\n", - " pascal_conversion = mass_conversion / (length_conversion * second2_conversion)\n", - "\n", - " # Convert array pointers\n", - " for i in range(num_radius):\n", - " radius_array_ptr[i] /= length_conversion\n", - " density_array_ptr[i] /= density_conversion\n", - " bulk_array_ptr[i] /= pascal_conversion\n", - " shear_array_ptr[i] /= pascal_conversion\n", - "\n", - " # Convert non-array pointers\n", - " radius_planet_to_use[0] = 1.0\n", - " bulk_density_to_use[0] = 1.0\n", - " G_to_use[0] = G / (length_conversion**3 / (mass_conversion * second2_conversion))\n", - " frequency_to_use[0] = frequency / (1. / second_conversion)\n", - "\n", - "cdef void cf_redimensionalize_physicals(\n", - " size_t num_radius,\n", - " double frequency,\n", - " double mean_radius,\n", - " double bulk_density,\n", - " double* radius_array_ptr,\n", - " double* density_array_ptr,\n", - " double_numeric* bulk_array_ptr,\n", - " double_numeric* shear_array_ptr,\n", - " double* radius_planet_to_use,\n", - " double* bulk_density_to_use,\n", - " double* frequency_to_use,\n", - " double* G_to_use\n", - " ) noexcept nogil:\n", - "\n", - " # Setup loop variables\n", - " cdef size_t i\n", - "\n", - " # Setup conversions\n", - " cdef double second2_conversion, second_conversion, length_conversion\n", - " cdef double density_conversion, mass_conversion, pascal_conversion\n", - " second2_conversion = 1. / (pi * G * bulk_density)\n", - " second_conversion = sqrt(second2_conversion)\n", - " length_conversion = mean_radius\n", - " density_conversion = bulk_density\n", - " mass_conversion = bulk_density * mean_radius**3\n", - " pascal_conversion = mass_conversion / (length_conversion * second2_conversion)\n", - "\n", - " # Convert array pointers\n", - " for i in range(num_radius):\n", - " radius_array_ptr[i] *= length_conversion\n", - " density_array_ptr[i] *= density_conversion\n", - " bulk_array_ptr[i] *= pascal_conversion\n", - " shear_array_ptr[i] *= pascal_conversion\n", - "\n", - " # Convert non-array pointers\n", - " radius_planet_to_use[0] = mean_radius\n", - " bulk_density_to_use[0] = bulk_density\n", - " G_to_use[0] = G\n", - " frequency_to_use[0] = frequency\n", - "\n", - "\n", - "cdef void cf_redimensionalize_radial_functions(\n", - " double complex* radial_function_ptr,\n", - " double mean_radius,\n", - " double bulk_density,\n", - " size_t num_slices,\n", - " size_t num_solutions = 1) noexcept nogil:\n", - " \"\"\" A function to re-dimensionalize physical parameters that have been previously non-dimensionalized.\n", - "\n", - " Parameters\n", - " ----------\n", - " radial_function_ptr : complex128*\n", - " Non-dimensionalized radial solutions as a function of radius.\n", - " mean_radius : float64\n", - " Mean radius of the planet, used in scaling [m]\n", - " bulk_density : float64\n", - " Bulk density of the planet, used in scaling [m]\n", - " num_slices : uint32\n", - " Number of radial slices, used for looping.\n", - " num_solutions : uint32, default=1\n", - " Number of solutions to loop through (size of radial_function_ptr is 6 * num_solutions * num_slices)\n", - "\n", - " \"\"\"\n", - " # Loop variables\n", - " cdef size_t slice_i, solver_i\n", - " # Setup conversions\n", - " cdef double second2_conversion = 1. / (pi * G * bulk_density)\n", - " cdef double mass_conversion = bulk_density * mean_radius**3\n", - " cdef double length_conversion = mean_radius\n", - " cdef double length_conversion3 = length_conversion**3\n", - "\n", - " for solver_i in range(num_solutions):\n", - " for slice_i in range(num_slices):\n", - " # Convert displacements\n", - " # y1, y3 are the radial and tangential displacements with units of [s2 m-1]\n", - " # y2, y4 are the radial and tangential stresses with units of [kg m-3]\n", - " # y5 is the tidal potential which is unitless and thus needs no conversion.\n", - " # y6 is a \"potential stress\" with units of [m-1]\n", - "\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 0] *= \\\n", - " (second2_conversion / length_conversion)\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 2] *= \\\n", - " (second2_conversion / length_conversion)\n", - "\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 1] *= \\\n", - " (mass_conversion / length_conversion3)\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 3] *= \\\n", - " (mass_conversion / length_conversion3)\n", - "\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 4] *= \\\n", - " 1.\n", - " radial_function_ptr[slice_i * 6 * num_solutions + solver_i * 6 + 5] *= \\\n", - " (1. / length_conversion)\n", - "\n", - "\n", - "def non_dimensionalize_physicals(\n", - " double frequency,\n", - " double mean_radius,\n", - " double bulk_density,\n", - " double[::1] radius_array_view,\n", - " double[::1] density_array_view,\n", - " double_numeric[::1] bulk_array_view,\n", - " double_numeric[::1] shear_array_view,\n", - " ):\n", - "\n", - " cdef size_t num_radius = radius_array_view.size\n", - " cdef double radius_planet_to_use, bulk_density_to_use, frequency_to_use, G_to_use\n", - " \n", - " cf_non_dimensionalize_physicals(\n", - " num_radius, frequency, mean_radius, bulk_density,\n", - " &radius_array_view[0], &density_array_view[0], \n", - " &bulk_array_view[0], &shear_array_view[0],\n", - " &radius_planet_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " return frequency_to_use, G_to_use\n", - "\n", - "def redimensionalize_physicals(\n", - " double frequency,\n", - " double mean_radius,\n", - " double bulk_density,\n", - " double[::1] radius_array_view,\n", - " double[::1] density_array_view,\n", - " double[::1] bulk_array_view,\n", - " double_numeric[::1] shear_array_view,\n", - " ):\n", - "\n", - " cdef size_t num_radius = radius_array_view.size\n", - " cdef double radius_planet_to_use, bulk_density_to_use, frequency_to_use, G_to_use\n", - " \n", - " cf_redimensionalize_physicals(\n", - " num_radius, frequency, mean_radius, bulk_density,\n", - " &radius_array_view[0], &density_array_view[0],\n", - " &bulk_array_view[0], &shear_array_view[0],\n", - " &radius_planet_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " return frequency_to_use, G_to_use\n", - "\n", - "def redimensionalize_radial_functions(\n", - " double complex[:, ::1] radial_function_view,\n", - " double mean_radius,\n", - " double bulk_density):\n", - " \"\"\" A function to re-dimensionalize physical parameters that have been previously non-dimensionalized.\n", - "\n", - " Parameters\n", - " ----------\n", - " radial_function_view : double complex[:, ::1]\n", - " Non-dimensionalized radial solutions as a function of radius.\n", - " mean_radius : float64\n", - " Mean radius of the planet, used in scaling [m]\n", - " bulk_density : float64\n", - " Bulk density of the planet, used in scaling [m]\n", - " num_slices : uint32\n", - " Number of radial slices, used for looping.\n", - " num_solutions : uint32, default=1\n", - " Number of solutions to loop through (size of radial_function_ptr is 6 * num_solutions * num_slices)\n", - "\n", - " \"\"\"\n", - " # Size of arrays\n", - " cdef size_t num_solutions, num_slices\n", - " num_solutions = (radial_function_view.shape[0] / 6)\n", - " num_slices = radial_function_view.shape[1]\n", - "\n", - " # Call cython function\n", - " cf_redimensionalize_radial_functions(\n", - " &radial_function_view.T[0, 0],\n", - " mean_radius,\n", - " bulk_density,\n", - " num_slices,\n", - " num_solutions\n", - " )\n", - "\n", - "\n", - "import numpy as np\n", - "cimport numpy as np\n", - "\n", - "from libc.stdio cimport printf\n", - "from libc.stdlib cimport exit\n", - "from libc.math cimport NAN\n", - "\n", - "\n", - "cdef void cf_get_surface_bc(\n", - " double* boundary_conditions_ptr,\n", - " int* bc_model_ptr,\n", - " size_t num_bcs,\n", - " double radius_to_use,\n", - " double bulk_density_to_use,\n", - " double degree_l_dbl,\n", - " ) noexcept nogil:\n", - " \"\"\"Find the surface boundary condition. \"\"\"\n", - "\n", - " # `num_bcs` should equal the length of `bc_model_ptr`\n", - " if num_bcs > 5:\n", - " printf(\n", - " \"Unsupported number of boundaries conditions encountered.\"\n", - " \" Provided: %d when maximum supported is 5.\", num_bcs)\n", - " exit(-1)\n", - " elif num_bcs <= 0:\n", - " printf(\n", - " \"Unsupported number of boundaries conditions encountered.\"\n", - " \" Provided: %d when minimum supported is 1.\", num_bcs)\n", - " exit(-1)\n", - " cdef size_t i, j\n", - "\n", - " # Inititalize all boundary conditions to NaN\n", - " # 15 = 5 (max_num_solutions) * 3 (number of surface conditions)\n", - " for i in range(15):\n", - " boundary_conditions_ptr[i] = NAN\n", - " \n", - " for j in range(num_bcs):\n", - " if bc_model_ptr[j] == 0:\n", - " # Free Surface\n", - " boundary_conditions_ptr[j * 3 + 0] = 0.\n", - " boundary_conditions_ptr[j * 3 + 1] = 0.\n", - " boundary_conditions_ptr[j * 3 + 2] = 0.\n", - " elif bc_model_ptr[j] == 1:\n", - " # Tidal Potential\n", - " boundary_conditions_ptr[j * 3 + 0] = 0.\n", - " boundary_conditions_ptr[j * 3 + 1] = 0.\n", - " boundary_conditions_ptr[j * 3 + 2] = (2. * degree_l_dbl + 1.) / radius_to_use\n", - " elif bc_model_ptr[j] == 2:\n", - " # Loading Potential\n", - " boundary_conditions_ptr[j * 3 + 0] = (-1. / 3.) * (2. * degree_l_dbl + 1.) * bulk_density_to_use\n", - " boundary_conditions_ptr[j * 3 + 1] = 0.\n", - " boundary_conditions_ptr[j * 3 + 2] = (2. * degree_l_dbl + 1.) / radius_to_use\n", - " else:\n", - " printf(\n", - " \"Unknown boundary condition model: %d. Supported models are:\\n\"\n", - " \" 0: Free Surface.\\n\"\n", - " \" 1: Tidal Potential.\\n\"\n", - " \" 2: Loading Potential.\\n\", bc_model_ptr[j])\n", - " exit(-1)\n", - "\n", - "\n", - "def get_surface_bc(\n", - " int[::1] bc_model_view,\n", - " double radius_to_use,\n", - " double bulk_density_to_use,\n", - " double degree_l_dbl,\n", - " ):\n", - "\n", - " cdef int* bc_model_ptr = &bc_model_view[0]\n", - " cdef size_t num_bcs = bc_model_view.size\n", - "\n", - " # Build output array\n", - " cdef np.ndarray[np.float64_t, ndim=1] boundary_conditions_arr = np.empty(15, dtype=np.float64)\n", - " cdef double[::1] boundary_conditions_view = boundary_conditions_arr\n", - " cdef double* boundary_conditions_ptr = &boundary_conditions_view[0]\n", - " cf_get_surface_bc(\n", - " boundary_conditions_ptr,\n", - " bc_model_ptr,\n", - " num_bcs,\n", - " radius_to_use,\n", - " bulk_density_to_use,\n", - " degree_l_dbl,\n", - " )\n", - " \n", - " return boundary_conditions_arr\n", - "\n", - "from libc.math cimport pi\n", - "\n", - "from cython.parallel cimport prange\n", - "\n", - "from TidalPy.constants cimport G\n", - "from TidalPy.utilities.math.complex cimport cf_cinv\n", - "\n", - "\n", - "cdef void cf_fundamental_matrix(\n", - " Py_ssize_t num_radial_slices,\n", - " double* radius_array_ptr,\n", - " double* density_array_ptr,\n", - " double* gravity_array_ptr,\n", - " double complex* complex_shear_array_ptr,\n", - " double complex* fundamental_mtx_ptr,\n", - " double complex* inverse_fundamental_mtx_ptr,\n", - " double complex* derivative_mtx_ptr,\n", - " unsigned char degree_l = 2,\n", - " double G_to_use = G\n", - " ) noexcept nogil:\n", - " \"\"\" Construct the fundamental matrix and its inverse for a generic order-l\n", - "\n", - " See Eq. 2.42 of SVC16\n", - "\n", - " Assumptions\n", - " -----------\n", - " - These matrices assume an incompressible body.\n", - "\n", - " Parameters\n", - " ----------\n", - " num_radial_slices : Py_ssize_t\n", - " Number of radial slices\n", - " radius_array_ptr : double\n", - " Pointer to array of Radius values [m]\n", - " density_array_ptr : double\n", - " Pointer to array of Density at each radius [kg m-3]\n", - " gravity_array_ptr : double\n", - " Pointer to array_ptr of acceleration due to gravity at each radius [m s-2]\n", - " complex_shear_array : double complex\n", - " Pointer to array of Complex shear modulus at each radius [Pa]\n", - " fundamental_mtx_ptr : double complex*\n", - " _Return Value_\n", - " 6 x 6 matrix of double complex values\n", - " Fundamental matrix used in the propagation technique\n", - " inverse_fundamental_mtx_ptr : double complex*\n", - " _Return Value_\n", - " The inverse of the fundamental matrix used in the propagation technique\n", - " derivative_mtx_ptr : double complex*\n", - " _Return Value_\n", - " The matrix, A, that satisfies the equation dy/dr = A * y\n", - " degree_l : unsigned char, default=2\n", - " Harmonic degree.\n", - " G_to_use : double, default=G\n", - " Gravitational constant used in calculations. Can be provided for non-dimensionalized solutions.\n", - " \"\"\"\n", - "\n", - " cdef Py_ssize_t r_i, index_shift\n", - " \n", - " cdef double radius, gravity, density\n", - " cdef double complex complex_shear\n", - " \n", - " cdef double r_inv, rl, rlp1, rlp2, rlp3, rnl, rnlm2, rlm1, rgp, piGp\n", - " cdef double coeff, d_coeff_1, d_coeff_2, d_coeff_3, d_coeff_4, d_coeff_5, d_coeff_6\n", - " cdef double complex mu_inv, rgp_s, r_s, pr_s\n", - "\n", - " # Degree-l Optimizations\n", - " cdef double degree_l_dbl = degree_l\n", - " cdef double dlm1 = (2. * degree_l_dbl - 1.)\n", - " cdef double l2p3lm1 = (degree_l_dbl**2 + 3. * degree_l_dbl - 1.)\n", - " cdef double l2mlm3 = (degree_l_dbl**2 - degree_l_dbl - 3.)\n", - " cdef double lp1 = (degree_l_dbl + 1.)\n", - " cdef double lp2 = (degree_l_dbl + 2.)\n", - " cdef double lp3 = (degree_l_dbl + 3.)\n", - " cdef double l2m1 = (degree_l_dbl**2 - 1.)\n", - " cdef double dlp1 = (2. * degree_l_dbl + 1.)\n", - " cdef double dlp3 = (2. * degree_l_dbl + 3.)\n", - "\n", - " for r_i in prange(num_radial_slices):\n", - "\n", - " # Shift index by 36 (for the inner 6x6 matrix)\n", - " index_shift = r_i * 36\n", - "\n", - " # Unpack radially dependent variables\n", - " radius = radius_array_ptr[r_i]\n", - " complex_shear = complex_shear_array_ptr[r_i]\n", - " gravity = gravity_array_ptr[r_i]\n", - " density = density_array_ptr[r_i]\n", - "\n", - " # Radius-based optimizations\n", - " r_inv = 1. / radius\n", - " mu_inv = cf_cinv(complex_shear)\n", - " rl = radius**degree_l\n", - " rlp1 = radius**(degree_l + 1)\n", - " rlp2 = radius**(degree_l + 2)\n", - " rlp3 = radius**(degree_l + 3)\n", - " rnl = radius**(-degree_l)\n", - " rnlm2 = radius**(-degree_l - 2)\n", - " rlm1 = radius**(degree_l - 1)\n", - " rgp = radius * gravity * density\n", - " rgp_s = rgp * mu_inv\n", - " r_s = radius * mu_inv\n", - " pr_s = density * r_s\n", - " piGp = pi * G_to_use * density\n", - " \n", - " # D Coefficients\n", - " coeff = (1. / dlp1)\n", - " d_coeff_1 = coeff * lp1 / rlp1\n", - " d_coeff_2 = coeff * degree_l_dbl * lp1 / (2. * dlm1 * rlm1)\n", - " d_coeff_3 = coeff * 1. / rlm1\n", - " d_coeff_4 = coeff * degree_l_dbl * rl\n", - " d_coeff_5 = coeff * rlp2 * degree_l_dbl * lp1 / (2. * dlp3)\n", - " d_coeff_6 = coeff * -rlp1\n", - "\n", - " \n", - " # Build Fundamental Matrix (zeros do not need to be specifically stated as they were put in at initialization)\n", - " # Eq. 2.42 in SVC\n", - " ## Row 1\n", - " fundamental_mtx_ptr[index_shift + 0] = degree_l_dbl * rlp1 / (2. * dlp3)\n", - " fundamental_mtx_ptr[index_shift + 1] = rlm1\n", - " fundamental_mtx_ptr[index_shift + 2] = 0.\n", - " fundamental_mtx_ptr[index_shift + 3] = lp1 * rnl / (2. * dlm1)\n", - " fundamental_mtx_ptr[index_shift + 4] = rnlm2\n", - " fundamental_mtx_ptr[index_shift + 5] = 0.\n", - "\n", - " ## Row 2\n", - " fundamental_mtx_ptr[index_shift + 6] = lp3 * rlp1 / (2. * dlp3 * lp1)\n", - " fundamental_mtx_ptr[index_shift + 7] = rlm1 / degree_l_dbl\n", - " fundamental_mtx_ptr[index_shift + 8] = 0.\n", - " fundamental_mtx_ptr[index_shift + 9] = (2. - degree_l_dbl) * rnl / (2. * degree_l_dbl * dlm1)\n", - " fundamental_mtx_ptr[index_shift + 10] = -rnlm2 / lp1\n", - " fundamental_mtx_ptr[index_shift + 11] = 0.\n", - "\n", - " ## Row 3\n", - " # RECORD: Believe there is a typo in HH14, they have the radius^l only on one term instead of both.\n", - " fundamental_mtx_ptr[index_shift + 12] = (degree_l_dbl * rgp + 2. * l2mlm3 * complex_shear) * rl / (2. * dlp3)\n", - " fundamental_mtx_ptr[index_shift + 13] = (rgp + 2. * (degree_l_dbl - 1.) * complex_shear) * radius**(degree_l_dbl - 2.)\n", - " fundamental_mtx_ptr[index_shift + 14] = -density * rl\n", - " fundamental_mtx_ptr[index_shift + 15] = (lp1 * rgp - 2. * l2p3lm1 * complex_shear) / (2. * dlm1 * rlp1)\n", - " fundamental_mtx_ptr[index_shift + 16] = (rgp - 2. * lp2 * complex_shear) / rlp3\n", - " fundamental_mtx_ptr[index_shift + 17] = -density / rlp1\n", - "\n", - " ## Row 4\n", - " fundamental_mtx_ptr[index_shift + 18] = degree_l_dbl * lp2 * complex_shear * rl / (dlp3 * lp1)\n", - " fundamental_mtx_ptr[index_shift + 19] = 2 * (degree_l_dbl - 1.) * complex_shear * radius**(degree_l_dbl - 2.) / degree_l_dbl\n", - " fundamental_mtx_ptr[index_shift + 20] = 0.\n", - " fundamental_mtx_ptr[index_shift + 21] = l2m1 * complex_shear / (degree_l_dbl * dlm1 * rlp1)\n", - " fundamental_mtx_ptr[index_shift + 22] = 2. * lp2 * complex_shear / (lp1 * rlp3)\n", - " fundamental_mtx_ptr[index_shift + 23] = 0.\n", - "\n", - " ## Row 5\n", - " fundamental_mtx_ptr[index_shift + 24] = 0.\n", - " fundamental_mtx_ptr[index_shift + 25] = 0.\n", - " fundamental_mtx_ptr[index_shift + 26] = -rl\n", - " fundamental_mtx_ptr[index_shift + 27] = 0.\n", - " fundamental_mtx_ptr[index_shift + 28] = 0.\n", - " fundamental_mtx_ptr[index_shift + 29] = -1. / rlp1\n", - "\n", - " ## Row 6\n", - " fundamental_mtx_ptr[index_shift + 30] = 2. * piGp * degree_l_dbl * rlp1 / dlp3\n", - " fundamental_mtx_ptr[index_shift + 31] = 4. * piGp * rlm1\n", - " fundamental_mtx_ptr[index_shift + 32] = -dlp1 * rlm1\n", - " fundamental_mtx_ptr[index_shift + 33] = 2 * piGp * lp1 / (dlm1 * rl)\n", - " fundamental_mtx_ptr[index_shift + 34] = 4. * piGp / rlp2\n", - " fundamental_mtx_ptr[index_shift + 35] = 0.\n", - "\n", - " # Inverse of the Fundamental Matrix\n", - " # This function manually defines the inverse matrix which is about 15--30% faster than a version that uses\n", - " # np.linalg.inv() to calculate the inverse matrix.\n", - " #\n", - " # From SVC16 Eq. 2.45: Fundamental Inverse = D_Mtx * Y^Bar_Mtx\n", - " # D_Mtx is a diagonal matrix with\n", - " # 1/(2l+1) * [ ... ]\n", - " # We are going to multiple first and just write down the fundamental matrix inverse to avoid the additional D*Ybar\n", - " # calculation.\n", - "\n", - " ## Row 1\n", - " inverse_fundamental_mtx_ptr[index_shift + 0] = d_coeff_1 * (rgp_s - 2. * lp2)\n", - " inverse_fundamental_mtx_ptr[index_shift + 1] = d_coeff_1 * (2. * degree_l_dbl * lp2)\n", - " inverse_fundamental_mtx_ptr[index_shift + 2] = d_coeff_1 * (-r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 3] = d_coeff_1 * (degree_l_dbl * r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 4] = d_coeff_1 * (pr_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 5] = 0.\n", - "\n", - " ## Row 2\n", - " inverse_fundamental_mtx_ptr[index_shift + 6] = d_coeff_2 * (-rgp_s + 2. * l2p3lm1 / lp1)\n", - " inverse_fundamental_mtx_ptr[index_shift + 7] = d_coeff_2 * (-2. * l2m1)\n", - " inverse_fundamental_mtx_ptr[index_shift + 8] = d_coeff_2 * (r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 9] = d_coeff_2 * ((2. - degree_l_dbl) * r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 10] = d_coeff_2 * (-pr_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 11] = 0.\n", - "\n", - " ## Row 3\n", - " inverse_fundamental_mtx_ptr[index_shift + 12] = d_coeff_3 * (4. * piGp)\n", - " inverse_fundamental_mtx_ptr[index_shift + 13] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 14] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 15] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 16] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 17] = -d_coeff_3\n", - "\n", - " ## Row 4\n", - " inverse_fundamental_mtx_ptr[index_shift + 18] = d_coeff_4 * (rgp_s + 2. * (degree_l_dbl - 1.))\n", - " inverse_fundamental_mtx_ptr[index_shift + 19] = d_coeff_4 * (2. * l2m1)\n", - " inverse_fundamental_mtx_ptr[index_shift + 20] = d_coeff_4 * (-r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 21] = d_coeff_4 * (-lp1 * r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 22] = d_coeff_4 * (pr_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 23] = 0.\n", - "\n", - " ## Row 5\n", - " inverse_fundamental_mtx_ptr[index_shift + 24] = d_coeff_5 * (-rgp_s - 2. * l2mlm3 / degree_l_dbl)\n", - " inverse_fundamental_mtx_ptr[index_shift + 25] = d_coeff_5 * (-2. * degree_l_dbl * lp2)\n", - " inverse_fundamental_mtx_ptr[index_shift + 26] = d_coeff_5 * (r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 27] = d_coeff_5 * (lp3 * r_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 28] = d_coeff_5 * (-pr_s)\n", - " inverse_fundamental_mtx_ptr[index_shift + 29] = 0.\n", - "\n", - " ## Row 6\n", - " inverse_fundamental_mtx_ptr[index_shift + 30] = d_coeff_6 * (4. * piGp * radius)\n", - " inverse_fundamental_mtx_ptr[index_shift + 31] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 32] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 33] = 0.\n", - " inverse_fundamental_mtx_ptr[index_shift + 34] = d_coeff_6 * dlp1\n", - " inverse_fundamental_mtx_ptr[index_shift + 35] = d_coeff_6 * (-radius)\n", - "\n", - " # Build derivative matrix\n", - " # Defined in SV04 -- Only valid for the incompressible case.\n", - " # See SVC16 Eq. 1.95\n", - " # Note: the lambda in SVC16 is defined as bulk_mod - (2. / 3.) * shear (Eq. 1.77; 2nd Lame parameter),\n", - " # for the incompressible assumption we will assume the ratio that SVC16 use (lambda / beta) -> 1 as K -> inf\n", - " # See SVC16 Eq. 1.95 for a compressible version. Take limit as K->inf to find below.\n", - " ## Row 1\n", - " derivative_mtx_ptr[index_shift + 0] = -2. * r_inv\n", - " derivative_mtx_ptr[index_shift + 1] = degree_l_dbl * lp1 * r_inv\n", - " derivative_mtx_ptr[index_shift + 2] = 0.\n", - " derivative_mtx_ptr[index_shift + 3] = 0.\n", - " derivative_mtx_ptr[index_shift + 4] = 0.\n", - " derivative_mtx_ptr[index_shift + 5] = 0.\n", - "\n", - " ## Row 2\n", - " derivative_mtx_ptr[index_shift + 6] = -1. * r_inv\n", - " derivative_mtx_ptr[index_shift + 7] = r_inv\n", - " derivative_mtx_ptr[index_shift + 8] = 0.\n", - " derivative_mtx_ptr[index_shift + 9] = mu_inv\n", - " derivative_mtx_ptr[index_shift + 10] = 0.\n", - " derivative_mtx_ptr[index_shift + 11] = 0.\n", - "\n", - " ## Row 3\n", - " derivative_mtx_ptr[index_shift + 12] = (4. * r_inv) * (3. * complex_shear * r_inv - density * gravity)\n", - " derivative_mtx_ptr[index_shift + 13] = -degree_l_dbl * lp1 * r_inv * (6. * complex_shear * r_inv - density * gravity)\n", - " derivative_mtx_ptr[index_shift + 14] = 0.\n", - " derivative_mtx_ptr[index_shift + 15] = degree_l_dbl * lp1 * r_inv\n", - " derivative_mtx_ptr[index_shift + 16] = -density * lp1 * r_inv\n", - " derivative_mtx_ptr[index_shift + 17] = density\n", - "\n", - " ## Row 4\n", - " derivative_mtx_ptr[index_shift + 18] = (-1. * r_inv) * (6. * complex_shear * r_inv - density * gravity)\n", - " derivative_mtx_ptr[index_shift + 19] = 2. * (2. * degree_l_dbl**2 + 2. * degree_l_dbl - 1.) * complex_shear * (r_inv**2)\n", - " derivative_mtx_ptr[index_shift + 20] = -r_inv\n", - " derivative_mtx_ptr[index_shift + 21] = -3. * r_inv\n", - " derivative_mtx_ptr[index_shift + 22] = density * r_inv\n", - " derivative_mtx_ptr[index_shift + 23] = 0.\n", - "\n", - " ## Row 5\n", - " derivative_mtx_ptr[index_shift + 24] = -4. * piGp\n", - " derivative_mtx_ptr[index_shift + 25] = 0.\n", - " derivative_mtx_ptr[index_shift + 26] = 0.\n", - " derivative_mtx_ptr[index_shift + 27] = 0.\n", - " derivative_mtx_ptr[index_shift + 28] = -lp1 * r_inv\n", - " derivative_mtx_ptr[index_shift + 29] = 1.\n", - "\n", - " ## Row 6\n", - " derivative_mtx_ptr[index_shift + 30] = -4. * piGp * (degree_l_dbl + 1) * r_inv\n", - " derivative_mtx_ptr[index_shift + 31] = 4. * piGp * degree_l_dbl * lp1 * r_inv\n", - " derivative_mtx_ptr[index_shift + 32] = 0.\n", - " derivative_mtx_ptr[index_shift + 33] = 0.\n", - " derivative_mtx_ptr[index_shift + 34] = 0.\n", - " derivative_mtx_ptr[index_shift + 35] = (degree_l_dbl - 1.) * r_inv\n", - "\n", - "\n", - "def fundamental_matrix(\n", - " double[::1] radius_array_view,\n", - " double[::1] density_array_view,\n", - " double[::1] gravity_array_view,\n", - " double complex[::1] complex_shear_array_view,\n", - " double complex[:, :, ::1] fundamental_mtx_view,\n", - " double complex[:, :, ::1] fundamental_mtx_inverse_view,\n", - " double complex[:, :, ::1] derivative_mtx_view, \n", - " unsigned char degree_l = 2,\n", - " double G_to_use = G\n", - " ):\n", - " \"\"\" Construct the fundamental matrix and its inverse using harmonic degree l.\n", - "\n", - " See Eq. 2.42 of SVC16\n", - "\n", - " Assumptions\n", - " -----------\n", - " - These matrices assume an incompressible body.\n", - "\n", - " Parameters\n", - " ----------\n", - " radius_array_view : double\n", - " Pointer to array of Radius values [m]\n", - " density_array_view : double\n", - " Pointer to array of Density at each radius [kg m-3]\n", - " gravity_array_view : double\n", - " Pointer to array of acceleration due to gravity at each radius [m s-2]\n", - " complex_shear_array_view : double complex\n", - " Pointer to array of Complex shear modulus at each radius [Pa]\n", - " fundamental_mtx_view : double complex[:, ::1]\n", - " _Return Value_\n", - " Fundamental matrix used in the propagation technique\n", - " fundamental_mtx_inverse_view : double complex[:, ::1]\n", - " _Return Value_\n", - " The inverse of the fundamental matrix used in the propagation technique\n", - " derivative_mtx_view : double complex[:, ::1]\n", - " _Return Value_\n", - " The matrix, A, that satisfies the equation dy/dr = A * y\n", - " degree_l : unsigned char, default=2\n", - " Harmonic degree.\n", - " G_to_use : double, default=G\n", - " Gravitational constant used in calculations. Can be provided for non-dimensionalized solutions.\n", - " \"\"\" \n", - "\n", - " cdef Py_ssize_t num_radial_slices\n", - " num_radial_slices = len(radius_array_view)\n", - "\n", - " # Check for unexpected shapes and sizes of return matrices\n", - " if len(density_array_view) != num_radial_slices:\n", - " raise ValueError('Unexpected size encountered for density array.')\n", - " if len(gravity_array_view) != num_radial_slices:\n", - " raise ValueError('Unexpected size encountered for gravity array.')\n", - " if len(complex_shear_array_view) != num_radial_slices:\n", - " raise ValueError('Unexpected size encountered for complex shear array.')\n", - " if (fundamental_mtx_view.shape[0] != num_radial_slices) or \\\n", - " (fundamental_mtx_view.shape[1] != 6) or \\\n", - " (fundamental_mtx_view.shape[2] != 6):\n", - " raise ValueError('Unexpected shape encountered for Fundamental Matrix.')\n", - " if (fundamental_mtx_inverse_view.shape[0] != num_radial_slices) or \\\n", - " (fundamental_mtx_inverse_view.shape[1] != 6) or \\\n", - " (fundamental_mtx_inverse_view.shape[2] != 6):\n", - " raise ValueError('Unexpected shape encountered for Fundamental Matrix (inv).')\n", - " if (derivative_mtx_view.shape[0] != num_radial_slices) or \\\n", - " (derivative_mtx_view.shape[1] != 6) or \\\n", - " (derivative_mtx_view.shape[2] != 6):\n", - " raise ValueError('Unexpected shape encountered for Derivative Matrix.')\n", - "\n", - " # Call cdef function.\n", - " cf_fundamental_matrix(\n", - " num_radial_slices,\n", - " &radius_array_view[0],\n", - " &density_array_view[0],\n", - " &gravity_array_view[0],\n", - " &complex_shear_array_view[0],\n", - " &fundamental_mtx_view[0, 0, 0],\n", - " &fundamental_mtx_inverse_view[0, 0, 0],\n", - " &derivative_mtx_view[0, 0, 0],\n", - " degree_l,\n", - " G_to_use\n", - " )\n", - "\n", - "cdef int MAX_NUM_Y = 6\n", - "\n", - "\n", - "cdef void cf_matrix_propagate(\n", - " RadialSolutionStorageCC* solution_storage_ptr,\n", - " size_t total_slices,\n", - " double* radius_array_ptr,\n", - " double frequency,\n", - " double planet_bulk_density,\n", - " EOSSolutionVec* eos_solution_bylayer_ptr,\n", - " size_t num_layers,\n", - " # TODO: In the future the propagation matrix should take in layer types and multiple layers\n", - " # int* layer_types_ptr,\n", - " # int* is_static_by_layer_ptr,\n", - " # int* is_incompressible_by_layer_ptr,\n", - " double* upper_radius_by_layer_ptr,\n", - " size_t num_bc_models,\n", - " int* bc_models_ptr,\n", - " double G_to_use = G,\n", - " unsigned int degree_l = 2,\n", - " unsigned char core_condition = 0,\n", - " cpp_bool nondimensionalize = True,\n", - " cpp_bool verbose = False,\n", - " cpp_bool raise_on_fail = False,\n", - " cpp_bool already_nondimed = False\n", - " ) noexcept nogil:\n", - "\n", - " # Setup\n", - " cdef size_t r_i, i, j, k, jj, ytype_i, slice_i\n", - " cdef size_t last_index_shift_36, index_shift_36, last_index_shift_18, index_shift_18, index_shift_max_y, full_shift\n", - " cdef cpp_bool error = False\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Propagator Matrix Method Called.\\n\")\n", - "\n", - " # Create gravity and density arrays used to build the matrices\n", - " cdef vector[double] density_array_vec = vector[double](0)\n", - " cdef vector[double] gravity_array_vec = vector[double](0)\n", - " cdef vector[double complex] complex_shear_array_vec = vector[double](0)\n", - " # TODO: Bulk modulus is not used in the propagation matrix method.\n", - " cdef vector[double complex] complex_bulk_array_vec = vector[double](0)\n", - " density_array_vec.reserve(total_slices)\n", - " gravity_array_vec.reserve(total_slices)\n", - " complex_shear_array_vec.reserve(total_slices)\n", - " complex_bulk_array_vec.reserve(total_slices)\n", - " cdef double* density_array_ptr = &density_array_vec[0]\n", - " cdef double* gravity_array_ptr = &gravity_array_vec[0]\n", - " cdef double complex* complex_shear_array_ptr = &complex_shear_array_vec[0]\n", - " cdef double complex* complex_bulk_array_ptr = &complex_bulk_array_vec[0]\n", - "\n", - " # Build storage used to call the EOS at each radius\n", - " # The EOS stores 7 doubles:\n", - " # 0: Gravity\n", - " # 1: Pressure\n", - " # 2: Density\n", - " # 3: Shear Mod (real)\n", - " # 4: Shear Mod (imag)\n", - " # 5: Bulk Mod (real)\n", - " # 6: Bulk Mod (imag)\n", - " cdef vector[double] y_array = vector[double](7)\n", - " cdef double* y_array_ptr = &y_array[0]\n", - "\n", - " # Build variables to help solve the EOS.\n", - " cdef double r\n", - " cdef int current_layer_i = 0\n", - " cdef double layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " cdef CySolverResult* eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Step through the radial steps to find EOS-dependent parameters\n", - " for i in range(total_slices):\n", - " r = radius_array_ptr[i]\n", - "\n", - " # Check if we are using the correct EOS solution (changes with layers)\n", - " if r > layer_r:\n", - " current_layer_i += 1\n", - " layer_r = upper_radius_by_layer_ptr[current_layer_i]\n", - " eos_solution_ptr = eos_solution_bylayer_ptr[current_layer_i]\n", - "\n", - " # Call the dense output of the EOS ODE solution to populate the y_interp pointer.\n", - " eos_solution_ptr.cyresult_ptr.call(r, y_array_ptr)\n", - "\n", - " # Store results\n", - " gravity_array_ptr[i] = y_array_ptr[0]\n", - " # Skip pressure at y-interp index 1\n", - " density_array_ptr[i] = y_array_ptr[2]\n", - " complex_shear_array_ptr[i] = cf_build_dblcmplx(y_array_ptr[3], y_array_ptr[4])\n", - " complex_bulk_array_ptr[i] = cf_build_dblcmplx(y_array_ptr[5], y_array_ptr[6])\n", - "\n", - " # Nondimensional variables\n", - " cdef double mean_radius = radius_array_ptr[total_slices - 1]\n", - " cdef double planet_radius_to_use = NAN\n", - " cdef double bulk_density_to_use = NAN\n", - " cdef double frequency_to_use = NAN\n", - " cdef double G_to_use = NAN\n", - "\n", - " if nondimensionalize and (not already_nondimed):\n", - " cf_non_dimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, complex_bulk_array_ptr, complex_shear_array_ptr,\n", - " &planet_radius_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " # Ensure that no errors occured during the non-dim process\n", - " if isnan(planet_radius_to_use) or isnan(bulk_density_to_use) or isnan(frequency_to_use) or isnan(G_to_use):\n", - " strcpy(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: NaNs encountered after non-dimensionalize call.\\n\")\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " if raise_on_fail:\n", - " exit(EXIT_FAILURE)\n", - " else:\n", - " # Leave inputs alone.\n", - " planet_radius_to_use = mean_radius\n", - " bulk_density_to_use = planet_bulk_density\n", - " frequency_to_use = frequency\n", - "\n", - " # Find boundary condition at the top of the planet -- this is dependent on the forcing type.\n", - " # Tides (default here) follow the (y2, y4, y6) = (0, 0, (2l+1)/R) rule\n", - " # The [5] represents the maximum number of solvers that can be invoked with a single call to radial_solver\n", - " cdef double degree_l_dbl = degree_l\n", - " cdef size_t max_num_solutions = 5\n", - " cdef size_t num_ytypes = num_bc_models\n", - "\n", - " # Boundary condition size: 15 = 5 (max_num_solutions) * 3 (number of surface conditions)\n", - " cdef double[15] boundary_conditions\n", - " cdef double* bc_pointer = &boundary_conditions[0]\n", - " cf_get_surface_bc(\n", - " bc_pointer, # Changed parameter\n", - " bc_models_ptr,\n", - " num_ytypes,\n", - " planet_radius_to_use,\n", - " bulk_density_to_use,\n", - " degree_l_dbl\n", - " )\n", - "\n", - " # Define memory for our fundamental matricies.\n", - " # These have to be heap allocated because we do not know the number of radial slices at compile time (and it could be large)\n", - " cdef size_t matrix_size = 6 * 6 * total_slices\n", - " cdef double complex* fundamental_mtx_ptr\n", - " cdef double complex* inverse_fundamental_mtx_ptr\n", - " cdef double complex* derivative_mtx_ptr\n", - " cdef double complex* propagation_mtx_ptr\n", - "\n", - " fundamental_mtx_ptr = allocate_mem(\n", - " sizeof(double complex) * matrix_size,\n", - " \"`fundamental_mtx_ptr` (cf_matrix_propagate)\"\n", - " )\n", - " inverse_fundamental_mtx_ptr = allocate_mem(\n", - " sizeof(double complex) * matrix_size,\n", - " \"`inverse_fundamental_mtx_ptr` (cf_matrix_propagate)\"\n", - " )\n", - " derivative_mtx_ptr = allocate_mem(\n", - " sizeof(double complex) * matrix_size,\n", - " \"`derivative_mtx_ptr` (cf_matrix_propagate)\"\n", - " )\n", - " \n", - " # Propagation matrix has 6 rows but only 3 columns.\n", - " cdef size_t prop_mat_size = 6 * 3 * total_slices\n", - " propagation_mtx_ptr = allocate_mem(\n", - " sizeof(double complex) * prop_mat_size,\n", - " \"`propagation_mtx_ptr` (cf_matrix_propagate)\"\n", - " )\n", - "\n", - " # Populate matricies with the correct layer type. \n", - " # TODO: Currently only solid, static, incompressible layers are supported for matrix propagation.\n", - " cf_fundamental_matrix(\n", - " total_slices,\n", - " radius_array_ptr,\n", - " density_array_ptr,\n", - " gravity_array_ptr,\n", - " complex_shear_array_ptr,\n", - " fundamental_mtx_ptr, # Changed variable\n", - " inverse_fundamental_mtx_ptr, # Changed variable\n", - " derivative_mtx_ptr, # Changed variable\n", - " degree_l,\n", - " G_to_use\n", - " )\n", - "\n", - " # Initialize the base of the propagation matrix to the initial conditions\n", - " ## From IcyDwarf: \"They are inconsequential on the rest of the solution, so false assumptions are OK.\"\n", - " # TODO Add more of these.\n", - " if core_condition == 0:\n", - " # Henning & Hurford (2014): \"At the core, a special seed matrix Bcore is created with only three columns,\n", - " # equal to the first, second, and third columns of Y for the properties at the base layer.\"\n", - " for j in range(6):\n", - " for k in range(3):\n", - " propagation_mtx_ptr[j * 6 + k] = fundamental_mtx_ptr[j * 6 + k]\n", - " elif core_condition == 1:\n", - " # Roberts & Nimmo (2008): liquid innermost zone.\n", - " for j in range(6):\n", - " for k in range(3):\n", - " if (j == 2) and (k == 0):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " elif (j == 3) and (k == 1):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " elif (j == 5) and (k == 2):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " else:\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " elif core_condition == 2:\n", - " # Solid innermost zone\n", - " for j in range(6):\n", - " for k in range(3):\n", - " if (j == 0) and (k == 0):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " elif (j == 1) and (k == 1):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " elif (j == 2) and (k == 2):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " else:\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " elif core_condition == 3:\n", - " # Solid innermost zone\n", - " for j in range(6):\n", - " for k in range(3):\n", - " if (j == 0) and (k == 0):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(0.05, 0.)\n", - " elif (j == 1) and (k == 1):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(0.01, 0.)\n", - " elif (j == 5) and (k == 2):\n", - " propagation_mtx_ptr[j * 6 + k] = cf_build_dblcmplx(1., 0.)\n", - " else:\n", - " propagation_mtx_ptr[j * 6 + k] = cmplx_zero\n", - " else:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Unknown starting core conditions encountered in `cf_matrix_propagate`: %d (acceptible values: 0, 1, 2, 3)\\n\", core_condition)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " if raise_on_fail:\n", - " exit(EXIT_FAILURE)\n", - "\n", - " # Step through the planet's shells and build the propagation matrix\n", - " # Need to find the inverse of the surface matrix (3 x 3)\n", - " # We will use a linear equation solver to solve: surface_solution = surface_matrix^-1 @ surface_bc\n", - " # Re-arranged: surface_matrix @ surface_solution = surface_bc\n", - " # ZGESV computes the solution to system of linear equations A * X = B for GE matrices\n", - " # See https://www.netlib.org/lapack/explore-html/d8/da6/group__gesv_ga0850dc117a6c7ec3cb64905d5de1cd23.html#ga0850dc117a6c7ec3cb64905d5de1cd23\n", - " \n", - " # Create the ZGESV \"A\" variable\n", - " cdef double complex[9] surface_matrix\n", - " cdef double complex* surface_matrix_ptr = &surface_matrix[0]\n", - " cdef double complex[9] surface_matrix_copy\n", - " cdef double complex* surface_matrix_copy_ptr = &surface_matrix_copy[0]\n", - "\n", - " cdef double complex temp_cmplx\n", - " cdef double complex[18] temp_matrix\n", - " cdef double complex* temp_matrix_ptr = &temp_matrix[0]\n", - "\n", - " # Create the ZGESV \"X\" variable\n", - " cdef double complex[3] surface_solution\n", - " cdef double complex* surface_solution_ptr = &surface_solution[0]\n", - "\n", - " # Create a copy of ZGESV \"B\" surface boundary condition because it is overwritten with each call of zgesv\n", - " cdef double complex[3] bc_copy\n", - " cdef double complex* bc_copy_ptr = &bc_copy[0]\n", - "\n", - " # Initialize surface matrix and temp_matrix to nan to help with debugging\n", - " for j in range(18):\n", - " if j < 3:\n", - " surface_solution_ptr[j] = cmplx_NAN\n", - " bc_copy_ptr[j] = cmplx_NAN\n", - " if j < 9:\n", - " surface_matrix_ptr[j] = cmplx_NAN\n", - " surface_matrix_copy_ptr[j] = cmplx_NAN\n", - " temp_matrix_ptr[j] = cmplx_NAN\n", - "\n", - " for r_i in range(1, total_slices):\n", - " \n", - " # Need to start the index for this radial slice. The shift is based on the size of the respective matrix.\n", - " # Fundamental matrix is 6x6\n", - " index_shift_36 = r_i * 36\n", - " last_index_shift_36 = (r_i - 1) * 36\n", - " # Propagation matrix is 6x3\n", - " index_shift_18 = r_i * 18\n", - " last_index_shift_18 = (r_i - 1) * 18\n", - "\n", - " # The function we are performing here is:\n", - " # P_{i} = Y_{i} @ ( Y_{i-1}^{-1} @ P_{i-1} )\n", - "\n", - " # Perform the first matrix multiplication\n", - " # A = Y_{i-1}^{-1} @ P_{i-1}\n", - " for j in range(6):\n", - " for k in range(3):\n", - " temp_cmplx = cf_build_dblcmplx(0., 0.)\n", - " for jj in range(6):\n", - " temp_cmplx += (\n", - " inverse_fundamental_mtx_ptr[last_index_shift_36 + j * 6 + jj] * \n", - " propagation_mtx_ptr[last_index_shift_18 + jj * 6 + k]\n", - " )\n", - " temp_matrix_ptr[j * 6 + k] = temp_cmplx\n", - " \n", - " # Now perform the outer matrix multiplication\n", - " # P_{i} = Y_{i} @ A\n", - " for j in range(6):\n", - " for k in range(3):\n", - " temp_cmplx = cf_build_dblcmplx(0., 0.)\n", - " for jj in range(6):\n", - " temp_cmplx += (\n", - " fundamental_mtx_ptr[index_shift_36 + j * 6 + jj] * \n", - " temp_matrix_ptr[jj * 6 + k]\n", - " )\n", - " propagation_mtx_ptr[index_shift_18 + j * 6 + k] = temp_cmplx\n", - " \n", - " # We need to define a matrix that equals the propagation matrix at the surface value.\n", - " # Surface condition matrix is a 3x3 matrix of the top-most shell of the propagation matrix's rows [3, 4, 6]\n", - " if r_i == (total_slices - 1):\n", - " for i in range(3):\n", - " surface_matrix_ptr[0 + i] = propagation_mtx_ptr[index_shift_18 + (2 * 6) + i]\n", - " surface_matrix_ptr[3 + i] = propagation_mtx_ptr[index_shift_18 + (3 * 6) + i]\n", - " surface_matrix_ptr[6 + i] = propagation_mtx_ptr[index_shift_18 + (5 * 6) + i]\n", - " \n", - " # Next we need to solve the linear equation U = S^-1 @ B\n", - " # Where U is the solution at the surface, S is the surface matrix constructed in the previous step, and B\n", - " # is the surface boundary condition. \n", - " # To do this we will use the linear equation solver for complex numbers, ZGESV. In order to use this we need to\n", - " # change the equation to A * X = B; or for our example: S * U = B\n", - " # More info on ZGESV: https://www.math.utah.edu/software/lapack/lapack-z/zgesv.html\n", - "\n", - " # Other information required by zgesv\n", - " # Size of matrix; 3x3\n", - " cdef int mat_size = 3\n", - " cdef int* mat_size_ptr = &mat_size\n", - " # Size of bc 3x1\n", - " cdef int bc_columns = 1\n", - " cdef int* bc_columns_ptr = &bc_columns\n", - "\n", - " # IPIV = Integer pivot array that is an additional output provided by ZGESV. It is not used but must be provided.\n", - " # It must be at least as large as the largest dimension of the input matrix, for this work that is 3.\n", - " cdef int[10] lapack_ipiv\n", - " cdef int* lapack_ipiv_ptr = &lapack_ipiv[0]\n", - "\n", - " # Info = flag set by the solver. -999 indicates ZGESV has not been called yet.\n", - " cdef int bc_solution_info = -999\n", - " cdef int* bc_solution_info_ptr = &bc_solution_info\n", - " \n", - " # Used to convert from SVC radial solutions to T&S format\n", - " cdef double complex[6] ts_conversion\n", - " cdef double complex* ts_conversion_ptr = &ts_conversion[0]\n", - " for i in range(6):\n", - " ts_conversion_ptr[i] = cmplx_NAN\n", - "\n", - " # Various index shifts\n", - " cdef size_t ytype_shift\n", - " cdef size_t solution_slice_ishift\n", - "\n", - " # Build solution\n", - " cdef double* solution_dbl_ptr = solution_storage_ptr.full_solution_ptr\n", - " # Cast the solution pointer from double to double complex\n", - " cdef double complex* solution_ptr = solution_dbl_ptr\n", - "\n", - " ytype_i = 0\n", - " while not error:\n", - "\n", - " # New y-type being solved (tidal, loading, free)\n", - " if ytype_i == num_bc_models:\n", - " break\n", - "\n", - " # Set linear solver flag to -999. This will indicate that the solver has not been called yet.\n", - " bc_solution_info_ptr[0] = -999\n", - "\n", - " # Set / reset the values of the RHS and LHS of the equation\n", - " # We use copies of these pointers since ZGESV overwrites the values on exit.\n", - " for j in range(9):\n", - " if j < 3:\n", - " bc_copy_ptr[j] = bc_pointer[ytype_i * 3 + j]\n", - " surface_matrix_copy_ptr[j] = surface_matrix_ptr[j]\n", - "\n", - " # Solve the linear equation\n", - " zgesv(\n", - " mat_size_ptr, # (Input)\n", - " bc_columns_ptr, # (Input)\n", - " surface_matrix_copy_ptr, # A; (Input & Output)\n", - " mat_size_ptr, # (Input)\n", - " lapack_ipiv_ptr, # (Output)\n", - " bc_copy_ptr, # B -> X (Input & Output)\n", - " mat_size_ptr, # (Input)\n", - " bc_solution_info_ptr # (Ouput)\n", - " )\n", - "\n", - " # Check for errors\n", - " if bc_solution_info_ptr[0] != 0:\n", - " sprintf(solution_storage_ptr.message_ptr, \"RadialSolver.PropMatrixMethod:: Error encountered while applying surface boundary condition. ZGESV code: %d \\nThe solutions may not be valid at the surface.\\n\", bc_solution_info)\n", - " error = True\n", - " if verbose or raise_on_fail:\n", - " printf(solution_storage_ptr.message_ptr)\n", - " if raise_on_fail:\n", - " exit(EXIT_FAILURE)\n", - " \n", - " # Step through each radial step and apply the propagation matrix to the surface solution\n", - " for slice_i in range(total_slices):\n", - " index_shift_18 = slice_i * 18\n", - " \n", - " ytype_shift = ytype_i * MAX_NUM_Y\n", - " solution_slice_ishift = num_bc_models * slice_i\n", - " full_shift = ytype_shift + solution_slice_ishift\n", - "\n", - " # Perform matrix multiplication: prop_matrix @ surface_solution \n", - " for j in range(6):\n", - " temp_cmplx = cf_build_dblcmplx(0., 0.)\n", - " for jj in range(3):\n", - " temp_cmplx += (\n", - " propagation_mtx_ptr[index_shift_18 + j * 6 + jj] * \n", - " bc_copy_ptr[jj] # Recall that bc_copy_ptr now contains the solution to the A * X = B linear system\n", - " )\n", - " solution_ptr[full_shift + j] = temp_cmplx\n", - " \n", - " # As discussed in B13 (discussed near their equation 7), SVC16 (and the earlier 2004 book) use a different\n", - " # convention for tidal_y than is used by Takeuchi and Saito (1972). Since a good chunk of the field follows the\n", - " # latter, we will do the same. Below are the conversions from SVC16 to TS72\n", - " ts_conversion_ptr[0] = solution_ptr[full_shift + 0] # No Change\n", - " ts_conversion_ptr[1] = solution_ptr[full_shift + 2] # Flip y3 for y2\n", - " ts_conversion_ptr[2] = solution_ptr[full_shift + 1] # Flip y2 for y3\n", - " ts_conversion_ptr[3] = solution_ptr[full_shift + 3] # No Change\n", - " ts_conversion_ptr[4] = -1. * solution_ptr[full_shift + 4] # Change sign\n", - " ts_conversion_ptr[5] = -1. * solution_ptr[full_shift + 5] # Change sign\n", - "\n", - " # Store converted values back into solution pointer\n", - " for i in range(6):\n", - " solution_ptr[full_shift + i] = ts_conversion_ptr[i]\n", - " \n", - " # Get ready for next y-type solution\n", - " ytype_i += 1\n", - "\n", - " # Redimensionalize\n", - " cdef double surface_gravity\n", - "\n", - " if nondimensionalize:\n", - " cf_redimensionalize_physicals(\n", - " total_slices, frequency, mean_radius, planet_bulk_density, radius_array_ptr, density_array_ptr,\n", - " gravity_array_ptr, bulk_modulus_ptr, complex_shear_modulus_array_ptr,\n", - " &planet_radius_to_use, &bulk_density_to_use, &frequency_to_use, &G_to_use\n", - " )\n", - " \n", - " # Reset surface gravity value\n", - " surface_gravity = gravity_array_ptr[total_slices - 1]\n", - "\n", - " if not error:\n", - " # Redimensionalize the solution \n", - " if nondimensionalize:\n", - " cf_redimensionalize_radial_functions(\n", - " solution_ptr,\n", - " mean_radius,\n", - " planet_bulk_density,\n", - " total_slices,\n", - " num_ytypes)\n", - " \n", - " # Calculate Love numbers\n", - " solution_storage_ptr.find_love(surface_gravity)\n", - "\n", - " # Update status message\n", - " strcpy(solution_storage_ptr.message_ptr, 'RadialSolver (propagation matrix method) completed without any noted issues.\\n')\n", - "\n", - " # Set solution status\n", - " solution_storage_ptr.success = not error\n", + "cimport gmpy2\n", + "from gmpy2 cimport import_gmpy2, mpc_t, mpc, GMPy_MPC_New, mpfr_t, MPFR_RNDN\n", + "import_gmpy2()\n", "\n", - " # Free memory\n", - " free_mem(fundamental_mtx_ptr)\n", - " free_mem(inverse_fundamental_mtx_ptr)\n", - " free_mem(derivative_mtx_ptr)\n", - " free_mem(propagation_mtx_ptr)\n" + "cdef mpfr_t r \n", + "gmpy2.mpfr_set_d(r, 20., MPFR_RNDN) \n", + "print(sizeof(r))\n", + "\n" ] }, { @@ -2240,7 +213,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/TidalPy/RadialSolver/derivatives/odes.pyx b/TidalPy/RadialSolver/derivatives/odes.pyx index 2f33ef41..74a9bff3 100644 --- a/TidalPy/RadialSolver/derivatives/odes.pyx +++ b/TidalPy/RadialSolver/derivatives/odes.pyx @@ -1,8 +1,16 @@ # distutils: language = c++ # cython: boundscheck=False, wraparound=False, nonecheck=False, cdivision=True, initializedcheck=False -from TidalPy.utilities.math.complex cimport cf_build_dblcmplx, cf_cabs +from TidalPy.utilities.math.complex cimport cf_build_dblcmplx, cf_cabs, cf_cinv from TidalPy.constants cimport d_EPS_DBL +from libc.float cimport DBL_DIG + +from libc.math cimport fabs +from libcpp cimport bool as cpp_bool +from libcpp.cmath cimport ilogb, ldexp +from libcpp.limits cimport numeric_limits + +from libc.float cimport DBL_MIN_EXP cdef double d_EPS_DBL_10 = 10.0 * d_EPS_DBL @@ -456,6 +464,27 @@ cdef void cf_solid_static_incompressible( dy_ptr[10] = dy6.real dy_ptr[11] = dy6.imag +cdef cpp_bool equal_zero_within_ulps(double x, size_t n) noexcept nogil: + #// Since `epsilon()` is the gap size (ULP, unit in the last place) + #// of floating-point numbers in interval [1, 2), we can scale it to + #// the gap size in interval [2^e, 2^{e+1}), where `e` is the exponent + #// of `x` and `y`. + + #// If `x` and `y` have different gap sizes (which means they have + #// different exponents), we take the smaller one. Taking the bigger + #// one is also reasonable, I guess. + cdef double m = min(fabs(x), 0.0) + + # // Subnormal numbers have fixed exponent, which is `min_exponent - 1`. + cdef int exp + if m < numeric_limits[double].min(): + exp = DBL_MIN_EXP - 1 + else: + exp = ilogb(m) + + #// We consider `x` and `y` equal if the difference between them is + #// within `n` ULPs. + return fabs(x) <= n * ldexp(numeric_limits[double].epsilon(), exp) cdef void cf_liquid_dynamic_compressible( double* dy_ptr, @@ -511,37 +540,33 @@ cdef void cf_liquid_dynamic_compressible( # For the liquid layer it is assumed that the shear modulus is zero so the lame parameter simply # equals the bulk modulus. Until bulk dissipation is considered, it will always be real-valued - cdef double complex lame_inverse = 1. / bulk_modulus + cdef double complex lame_inverse = cf_cinv(bulk_modulus) # y3 derivative is undetermined for a liquid layer, but we can calculate its value which is still used in the # other derivatives. - # cdef long double complex t0 = (1. / dynamic_term) - # cdef long double complex t1 = y2 - # cdef long double complex t2 = -density_gravity * y1 - # cdef long double complex t3 = density * y5 - # cdef long double complex tadd12 = t1 + t2 - # cdef long double complex tadd123 = tadd12 + t3 - # cdef long double complex multi = tadd123 * t0 - - # printf("\t1/w = %e %e; y2 = %e %e; -rho g y1 = %e %e; rho y5 = %e %e\n", t0.real, t0.imag, t1.real, t1.imag, t2.real, t2.imag, t3.real, t3.imag) - # printf("\tadd = %e %e; Multi = %e %e\n", tadd123.real, tadd123.imag, multi.real, multi.imag) - # cdef double complex y2y5 = y2 + density * y5 - # printf("\ty2y5 = %e %e; d_EPS_DBL_10 = %e\n", y2y5.real, y2y5.imag, d_EPS_DBL_10) - # if cf_cabs(y2y5) < d_EPS_DBL_10: - # printf("\tHIT BREAKER\n") - # y2y5 = 0.0 - - cdef long double y2y5_r = y2.real + (density * y5.real) - cdef long double y2y5_i = y2.imag + (density * y5.imag) - cdef long double y3_r = (1. / dynamic_term) * (y2y5_r - (density_gravity * y1.real)) - cdef long double y3_i = (1. / dynamic_term) * (y2y5_i - (density_gravity * y1.imag)) - cdef double complex y3 = cf_build_dblcmplx(y3_r, y3_i) - - # cdef double complex y2y5 = y2 + density * y5 - # cdef double complex y3 = (1. / dynamic_term) * (y2y5 - density_gravity * y1) - cdef double complex y1_y3_term = 2. * y1 - args_ptr.llp1 * y3 - # printf("\ty3 = %e %e; y1y3 = %e %e\n", y3.real, y3.imag, y1_y3_term.real, y1_y3_term.imag) + # TODO: There are issues with this summation and the floating point errors. If you sum term 1 + 2 + 3 you get one + # Answer, if you sum 1 + 3 + 2 you get another. In either case the sum is close to zero in a lot of cases + # So the differences here can cause sign changes or large swings in outcomes. + # cdef double complex y3 = (1. / dynamic_term) * (y2 - density_gravity * y1 + density * y5) + + # After some testing, found that dividing out the y2 and then checking if the sum is < eps may help. + # cdef double complex y3 = (y2 / dynamic_term) * (1.0 - density_gravity * y1/y2 + density * y5/y2) + # cdef double complex y1y2 = y1 / y2 + # cdef double complex y5y2 = y5 / y2 + cdef double complex coeff_r = (args_ptr.llp1 / (f2 * radius)) + # cdef double complex y3_sum = (y2 + density * y5) + # y3_sum -= density_gravity * y1 + + # if cf_cabs(y3_sum) < d_EPS_DBL: + # y3 = cf_build_dblcmplx(0.0, 0.0) + # y1_y3_term = 2. * y1 + # else: + # y3 = coeff * y3_sum + cdef double complex y1_y3_term = \ + (y1 * (2.0 - gravity * coeff_r)) + \ + (y2 * coeff_r / density) + \ + (y5 * coeff_r) # Eqs. 11--14 in KMN15 equations look like they don't match TS72 because they applied the rheology already. # and substituted y3. diff --git a/pyproject.toml b/pyproject.toml index 06efd3f3..c25df858 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name='TidalPy' -version = '0.6.0a7.dev4' +version = '0.6.0a7.dev8' description='Tidal Dynamics and Thermal-Orbital Evolution Software Suite Implemented in Cython and Python' authors= [ {name = 'Joe P. Renaud', email = 'TidalPy@gmail.com'} @@ -25,7 +25,7 @@ dependencies = [ "astroquery", # Graphics "matplotlib>=3.4.2", - "cmcrameri>=1.4", + "cmcrameri>=1.4" ] license = {file = "LICENSE.md"} readme = "README.md"