diff --git a/.ipynb_checkpoints/demo-checkpoint.ipynb b/.ipynb_checkpoints/demo-checkpoint.ipynb new file mode 100644 index 0000000..4a17e7c --- /dev/null +++ b/.ipynb_checkpoints/demo-checkpoint.ipynb @@ -0,0 +1,1545 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import cupy as cp\n", + "import gamma.interface as rs\n", + "from multiprocessing import Process\n", + "import time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code to Create Laser Power" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Importing necessary modules\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "# Variables to control frequency and total time\n", + "TOTAL_TIME = 400 # in seconds\n", + "Time_Step = 0.002 # default frequency\n", + "\n", + "\n", + "def fourier_series(x, params, rescale_mag=600, rescale_amplitude=50):\n", + " \"\"\"\n", + " Computes the nth partial sum of the Fourier series with the specified frequency, amplitude, and phase.\n", + " Also includes trend and seasonality.\n", + " \"\"\"\n", + "\n", + " # Utility function to normalize a set of values to the range [-1, 1]\n", + " def normalize(x):\n", + " return 2 * (x - np.min(x)) / (np.max(x) - np.min(x)) - 1\n", + "\n", + " # Utility function to rescale a value from [0, 1] to [min_value, max_value]\n", + " def rescale(x, min_value, max_value):\n", + " return x * (max_value - min_value) + min_value\n", + "\n", + " # Normalizing the x values to the range [-1, 1]\n", + " x = normalize(x)\n", + "\n", + " # Extract and scale the parameters for the Fourier series\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(rescale(n, 0, 10))\n", + " freq = rescale(freq, 0, 10)\n", + " amplitude = rescale(amplitude, 0, 10)\n", + " phase = rescale(phase, 0, 10000)\n", + " trend = rescale(trend, -500, 500)\n", + " seasonality = rescale(seasonality, 0, 200)\n", + "\n", + " # Compute the Fourier series using the scaled parameters\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + "\n", + " # Check if the computed Fourier series is a zero vector. If yes, return a vector of constant values\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + 600\n", + " else:\n", + " # Scale the computed Fourier series to the range [0, 1]\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + rescale_mag\n", + "\n", + " # Add a linear trend to the computed Fourier series\n", + " y += trend * x\n", + "\n", + " # Add a seasonal pattern to the computed Fourier series\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + "\n", + " return y\n", + "\n", + "# Generate x values between 0 and 1000 in 1000 evenly spaced steps\n", + "x = np.linspace(0, TOTAL_TIME, int(TOTAL_TIME / 0.002))\n", + "\n", + "# Generate random parameters for the Fourier series\n", + "params = np.random.rand(6)\n", + "\n", + "# Compute the Fourier series for the generated x values and random parameters\n", + "y = fourier_series(x, params)\n", + "\n", + "# Plot the computed Fourier series\n", + "plt.plot(x, y, label=f'Curve')\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Laser Power\")\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "# Generate a CSV string of the computed Fourier series and the corresponding x values\n", + "output_string = \"laser_power,time_elapsed\\n\"\n", + "for i in range(len(x)):\n", + " output_string += f\"{y[i]:.15f},{x[i]:.3f}\\n\" # Changed the format for x[i] to 3 decimal places\n", + "\n", + "# Save the generated CSV string to a file\n", + "with open(\"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.csv\", \"w\") as f:\n", + " f.write(output_string)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Class of generating laser power " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import os\n", + "\n", + "class FourierSeriesGenerator:\n", + "\n", + " def __init__(self, total_time=400, time_step=0.002):\n", + " self.default_total_time = total_time\n", + " self.default_time_step = time_step\n", + "\n", + " @staticmethod\n", + " def _normalize(x):\n", + " return 2 * (x - np.min(x)) / (np.max(x) - np.min(x)) - 1\n", + "\n", + " @staticmethod\n", + " def _rescale(x, min_value, max_value):\n", + " return x * (max_value - min_value) + min_value\n", + "\n", + " def fourier_series(self, x, params, rescale_mag=600, rescale_amplitude=50):\n", + " x = self._normalize(x)\n", + "\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(self._rescale(n, 0, 10))\n", + " freq = self._rescale(freq, 0, 10)\n", + " amplitude = self._rescale(amplitude, 0, 10)\n", + " phase = self._rescale(phase, 0, 10000)\n", + " trend = self._rescale(trend, -500, 500)\n", + " seasonality = self._rescale(seasonality, 0, 200)\n", + "\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + 600\n", + " else:\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + rescale_mag\n", + "\n", + " y += trend * x\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + " return y\n", + "\n", + " def plot_and_save(self, params, base_path, iteration, total_time=None, time_step=None):\n", + " if total_time is None:\n", + " total_time = self.default_total_time\n", + " if time_step is None:\n", + " time_step = self.default_time_step\n", + "\n", + " folder_name = f\"Iteration_{iteration}\"\n", + " save_directory = os.path.join(base_path, folder_name)\n", + " if not os.path.exists(save_directory):\n", + " os.makedirs(save_directory) # Create directory if it doesn't exist\n", + "\n", + " x = np.linspace(0, total_time, int(total_time / time_step))\n", + " y = self.fourier_series(x, params)\n", + "\n", + " plt.plot(x, y, label=f'Curve')\n", + " plt.xlabel(\"Time\")\n", + " plt.ylabel(\"Laser Power\")\n", + " plt.legend()\n", + " image_path = os.path.join(save_directory, \"plot.png\")\n", + " plt.savefig(image_path)\n", + " plt.show()\n", + "\n", + " output_string = \"laser_power,time_elapsed\\n\"\n", + " for i in range(len(x)):\n", + " output_string += f\"{y[i]:.15f},{x[i]:.2f}\\n\"\n", + " csv_path = os.path.join(save_directory, \"data.csv\")\n", + " with open(csv_path, \"w\") as f:\n", + " f.write(output_string)\n", + "\n", + "# Example usage:\n", + "generator = FourierSeriesGenerator()\n", + "params = np.random.rand(6)\n", + "base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + "iteration_number = 2\n", + "generator.plot_and_save(params, base_path, iteration_number, total_time=300, time_step=0.02)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inverse Fourier" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df = pd.read_excel(\"/home/vnk3019/ded_dt_thermomechanical_solver/laser_power_data.xlsx\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "221.3147238441714\n", + "14252\n" + ] + } + ], + "source": [ + "df[\"NLP_40\"]\n", + "last_element = df[\"NLP_40\"].iloc[-1]\n", + "print(last_element)\n", + "num_rows = len(df)\n", + "print(num_rows)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "221.3147238441714\n", + "14252\n", + "[5.00000000e+00 9.96864946e-01 3.97671723e+00 1.57878121e-04\n", + " 4.99239013e-01 8.69946792e-10]\n" + ] + }, + { + "data": { + "image/png": "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tImIiIiIiIgMxESbiIiIiIiIyEBMtL3AZjM7AiIiIiIiIvIWJtpEREREREREBmKiTURERERERGQgJtoepJTZERAREREREZG3MdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbS+w2cyOgIiIiIiIiLyFiTYRERERERGRgZhoExERERERERmIiTYRERERERGRgZhoe5BSZkdARERERERE3sZEm4iIiIiIiMhATLSJiIiIiIiIDMREm4iIiIiIiMhATLSJiIiIiIiIDMREm4iIiIiIiMhATLSJiIiIiIiIDMRE2wtsNrMjICIiIiIiIm9hok1ERERERERkICbaRERERERERAZiok1ERERERERkICbaHqSU2REQERERERGRtzHRJiIiIiIiIjIQE20iIiIiIiIiAzHRJiIiIiIiIjIQE20iIiIiIiIiAzHRJiIiIiIiIjIQE20iIiIiIiIiAzHR9gKbzewIiIiIiIiIyFuYaBMREREREREZiIk2ERERERERkYGYaBMREREREREZiIm2BylldgRERERERETkbUy0iYiIiIiIiAzERJuIiIiIiIjIQEy0iYiIiIiIiAzERJuIiIiIiIjIQEy0iYiIiIiIiAzERJuIiIiIiIjIQEy0vcBmMzsCIiIiIiIi8hYm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2h6klNkREBERERERkbe5nWivWrUKDz30ECIjI2Gz2bBgwQKn55VSGDVqFMqUKYPg4GBERUXhwIEDTttcunQJPXv2RGhoKIoWLYq+ffsiPj4+X/8IERERERERkRW4nWhfv34d9erVw6RJk7J8/qOPPsIXX3yBKVOmYMOGDShcuDDatm2LpKSkjG169uyJPXv2YPny5Vi4cCFWrVqFfv365f2/ICIiIiIiIrKIAu7+Qfv27dG+ffssn1NK4bPPPsObb76Jzp07AwBmzJiB0qVLY8GCBXjsscewb98+LFmyBJs2bUKjRo0AABMnTkSHDh0wfvx4REZG3vC6ycnJSE5Ozrh/9epVd8MmIiIiIiIi8gpDx2gfOXIEsbGxiIqKyngsLCwMTZo0wbp16wAA69atQ9GiRTOSbACIioqCn58fNmzYkOXrjhs3DmFhYRk/5cuXNzJsIiIiIiIiIsMYmmjHxsYCAEqXLu30eOnSpTOei42NRalSpZyeL1CgAMLDwzO2yWzEiBGIi4vL+Dlx4oSRYRMREREREREZxu2u42YICgpCUFCQ2WHkmc1mdgRERERERETkLYa2aEdERAAAzp496/T42bNnM56LiIjAuXPnnJ5PS0vDpUuXMrYhIiIiIiIi8lWGJtqVK1dGREQEVqxYkfHY1atXsWHDBjRr1gwA0KxZM1y5cgVbtmzJ2Obvv/+G3W5HkyZNjAyHiIiIiIiIyOvc7joeHx+PgwcPZtw/cuQItm/fjvDwcFSoUAEvv/wy3nvvPVSrVg2VK1fGW2+9hcjISHTp0gUAUKtWLbRr1w7PPfccpkyZgtTUVAwaNAiPPfZYljOOExEREREREfkStxPtzZs3o3Xr1hn3hw4dCgDo3bs3pk+fjtdeew3Xr19Hv379cOXKFdxzzz1YsmQJChYsmPE3P/74IwYNGoT7778ffn5+6NatG7744gsD/h0iIiIiIiIic9mUUsrsINx19epVhIWFIS4uDqGhoWaHk60+fYDvvwc+/BB47TWzoyEiIiIiIqK8cicPNXSMNhEREREREdGtjok2ERERERERkYGYaBMREREREREZiIk2ERERERERkYGYaBMREREREREZiIm2F9hsZkdARERERERE3sJEm4iIiIiIiMhATLSJiIiIiIiIDMREm4iIiIiIiMhATLSJiIiIiIiIDMRE24OUMjsCIiIiIiIi8jYm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqLtBTab2REQERERERGRtzDRJiIiIiIiIjIQE20iIiIiIiIiAzHRJiIiIiIiIjIQE20iIiIiIiIiAzHRJiIiIiIiIjIQE20PUsrsCIiIiIiIiMjbmGgTERERERERGYiJNhEREREREZGBmGgTERERERERGYiJNhEREREREZGBmGh7gc1mdgRERERERETkLUy0iYiIiIiIiAzERJuIiIiIiIjIQEy0iYiIiIiIiAzERJuIiIiIiIjIQEy0iYiIiIiIiAzERNuDlDI7AiIiIiIiIvI2JtpEREREREREBmKiTURERERERGQgJtpEREREREREBmKiTURERERERGQgJtpeYLOZHQERERERERF5CxNtIiIiIiIiIgMx0SYiIiIiIiIyEBNtIiIiIiIiIgMx0SYiIiIiIiIyEBNtIiIiIiIiIgMx0SYiIiIiIiIyEBNtD1LK7AiIiIiIiIjI25hoExERERERERmIiTYRERERERGRgZhoExERERERERmIibYX2GxmR0BERERERETewkSbiIiIiIiIyEBMtImIiIiIiIgMxESbiIiIiIiIyEBMtImIiIiIiIgMxESbiIiIiIiIyEBMtImIiIiIiIgMxETbg5QyOwIiIiIiIiLyNibaRERERERERAZiok1ERERERERkICbaRERERERERAZiou0FNpvZERAREREREZG3MNEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMpDhifaYMWNgs9mcfmrWrJnxfFJSEgYOHIjixYsjJCQE3bp1w9mzZ40Og4iIiIiIiMgUHmnRvv3223HmzJmMnzVr1mQ8N2TIEPzxxx/4+eefER0djdOnT6Nr166eCMN0SpkdAREREREREXlbAY+8aIECiIiIuOHxuLg4fPvtt5g1axbuu+8+AMC0adNQq1YtrF+/Hk2bNs3y9ZKTk5GcnJxx/+rVq54Im4iIiIiIiCjfPNKifeDAAURGRqJKlSro2bMnjh8/DgDYsmULUlNTERUVlbFtzZo1UaFCBaxbty7b1xs3bhzCwsIyfsqXL++JsImIiIiIiIjyzfBEu0mTJpg+fTqWLFmCyZMn48iRI7j33ntx7do1xMbGIjAwEEWLFnX6m9KlSyM2Njbb1xwxYgTi4uIyfk6cOGF02ERERERERESGMLzrePv27TN+r1u3Lpo0aYKKFSvip59+QnBwcJ5eMygoCEFBQUaF6HU2m9kREBERERERkbd4fHmvokWLonr16jh48CAiIiKQkpKCK1euOG1z9uzZLMd0ExEREREREfkajyfa8fHxOHToEMqUKYOGDRsiICAAK1asyHg+JiYGx48fR7NmzTwdChEREREREZHHGd51fNiwYXjooYdQsWJFnD59GqNHj4a/vz8ef/xxhIWFoW/fvhg6dCjCw8MRGhqKF198Ec2aNct2xnEiIiIiIiIiX2J4on3y5Ek8/vjjuHjxIkqWLIl77rkH69evR8mSJQEAEyZMgJ+fH7p164bk5GS0bdsWX331ldFhEBEREREREZnC8ER7zpw5OT5fsGBBTJo0CZMmTTL6rYmIiIiIiIhM5/Ex2kRERERERES3EibaRERERERERAZiou1BSpkdAREREREREXkbE20iIiIiIiIiAzHRJiIiIiIiIjIQE20vsNnMjoCIiIiIiIi8hYk2ERERERERkYGYaBMREREREREZiIk2ERERERERkYGYaBMREREREREZiIk2ERERERERkYGYaBMREREREREZiIk2ERERERERkYGYaHuQUmZHQERERERERN7GRJuIiIiIiIjIQEy0iYiIiIiIiAzERNsLbDazIyAiIiIiIiJvYaJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2h6klNkREBERERERkbcx0SYiIiIiIiIyEBNtIiIiIiIiIgMx0fYCm83sCIiIiIiIiMhbmGgTERERERERGYiJNhEREREREZGBmGgTERERERERGYiJNhEREREREZGBmGgTERERERERGYiJNhEREREREZGBmGgTERERERERGYiJNhEREREREZGBCpgdwM1MKbMjICIiIiLSpaenIzU11ewwiCwpICAA/v7+hrwWE20iIiIiopucUgqxsbG4cuWK2aEQWVrRokUREREBm82Wr9dhou0F+fyOiIiIiIjyRUuyS5UqhUKFCuU7iSC62SilkJCQgHPnzgEAypQpk6/XY6JNRERERHQTS09Pz0iyixcvbnY4RJYVHBwMADh37hxKlSqVr27knAyNiIiIiOgmpo3JLlSokMmREFmfdpzkdy4DJtpERERERLcAdhcnyp1RxwkTbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIi8nk2mw0LFiwwOwwiAEy0iYiIiIjIwmJjYzF48GBUrVoVBQsWROnSpdG8eXNMnjwZCQkJGdudOXMG7du3NzFS4OjRo7DZbNi+fbupcbjCZrNl/ISFhaF58+b4+++/zQ7rpsFEm4iIiIiILOnw4cOoX78+li1bhrFjx2Lbtm1Yt24dXnvtNSxcuBB//fVXxrYREREICgoyMVrrUUohLS0t2+enTZuGM2fOYO3atShRogQefPBBHD582IsRZi8lJcXsEPKFibYHKWV2BEREREREN1IKuH7dnB93ysgDBgxA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Hx5//PGM56pXr46ePXuiV69e+OSTT1C/fn2cP38eK1asQN26ddGxY8d8xZ25FR4Abr/9dlSrVg2//vorHnroIdhsNrz11luw2+0Z2yxcuBCHDx9GixYtUKxYMSxevBh2ux01atRAkSJFMGzYMAwZMgR2ux333HMP4uLisHbtWoSGhqJ37975itnRgAED8Nlnn+HFF1/EoEGDEBMTg9GjR2Po0KHw85P5tIsVK4a6devixx9/xJdffgkAaNGiBXr06IHU1FSnyoDhw4ejadOmGDRoEJ599lkULlwYe/fuxfLlyzP+9mbDRJuIiIiIiCzptttuw7Zt2zB27FiMGDECJ0+eRFBQEGrXro1hw4ZhwIABOf59z5490aFDB7Ro0cKpizIga0i/9957eOWVV3Dq1CmUKFECTZs2xYMPPpjvuB977LEbHjtx4gQ+/fRTPPPMM7j77rtRokQJDB8+HFevXs3YpmjRovj1118xZswYJCUloVq1apg9ezZuv/12AMC7776LkiVLYty4cTh8+DCKFi2KBg0aYOTIkfmO2VHZsmWxePFivPrqq6hXrx7Cw8PRt29fvPnmm07btWzZEtu3b8+YXTw8PBy1a9fG2bNnUaNGjYzt6tati+joaLzxxhu49957oZTCbbfdhkcffdTQuK3EpvIzyMAkV69eRVhYGOLi4hAaGmp2ONl65BHgl1+ASZOAXM4BREREREQekZSUhCNHjqBy5cooWLCg2eEQWVpOx4s7eSjX0SYiIiIiIiIyEBNtIiIiIiIiIgMx0fYg3+uUT0RERERERPnFRJuIiIiIiIjIQEy0veD/l54jIiIiIiKiWwATbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIqJbXp8+fdClS5eM+61atcLLL7/s9ThWrlwJm82GK1eueP29yTimJtqTJk1CpUqVULBgQTRp0gQbN240MxwiIiIiIrKQPn36wGazwWazITAwEFWrVsU777yDtLQ0j7/3r7/+infffdelbb2dHFeqVAmfffaZV94rP1q1apXx/RUsWBC1a9fGV199ZXZYXmFaoj137lwMHToUo0ePxtatW1GvXj20bdsW586dMyskIiIiIiKymHbt2uHMmTM4cOAAXnnlFYwZMwYff/xxltumpKQY9r7h4eEoUqSIYa93M0tNTc32ueeeew5nzpzB3r170aNHDwwcOBCzZ8/2YnTZM3J/ycy0RPvTTz/Fc889h6effhq1a9fGlClTUKhQIXz33XdmhURERERERBYTFBSEiIgIVKxYEf3790dUVBR+//13AHp37/fffx+RkZGoUaMGAODEiRPo0aMHihYtivDwcHTu3BlHjx7NeM309HQMHToURYsWRfHixfHaa69BKeX0vpm7jicnJ2P48OEoX748goKCULVqVXz77bc4evQoWrduDQAoVqwYbDYb+vTpAwCw2+0YN24cKleujODgYNSrVw+//PKL0/ssXrwY1atXR3BwMFq3bu0UZ16kp6ejb9++Ge9Zo0YNfP75507brFy5EnfddRcKFy6MokWLonnz5jh27FjG87/99hsaNGiAggULokqVKnj77bedehHYbDZMnjwZnTp1QuHChfH+++9nG0+hQoUQERGBKlWqYMyYMahWrVrG93f8+HF07twZISEhCA0NRY8ePXD27FkAQFxcHPz9/bF58+aMzzI8PBxNmzbNeO0ffvgB5cuXz7if2/ee3f7iCaYk2ikpKdiyZQuioqL0QPz8EBUVhXXr1t2wfXJyMq5ever0Q0RERERE+XT9evY/SUmub5uY6Nq2BggODnZqiVyxYgViYmKwfPlyLFy4EKmpqWjbti2KFCmC1atXY+3atQgJCUG7du0y/u6TTz7B9OnT8d1332HNmjW4dOkS5s+fn+P79urVC7Nnz8YXX3yBffv2YerUqQgJCUH58uUxb948AEBMTAzOnDmTkdiOGzcOM2bMwJQpU7Bnzx4MGTIETz75JKKjowFIYti1a1c89NBD2L59O5599lm8/vrr+fp87HY7ypUrh59//hl79+7FqFGjMHLkSPz0008AgLS0NHTp0gUtW7bEzp07sW7dOvTr1w82mw0AsHr1avTq1QuDBw/G3r17MXXqVEyfPv2GZHrMmDF4+OGHsWvXLjzzzDMux6d9f3a7HZ07d8alS5cQHR2N5cuX4/Dhw3j00UcBAGFhYbjzzjuxcuVKAMCuXbtgs9mwbds2xMfHAwCio6PRsmVLAHDpewdu3F88Rpng1KlTCoD6999/nR5/9dVX1V133XXD9qNHj1YAbviJi4vzVsh50q2bUoBSX31ldiREREREdKtKTExUe/fuVYmJiTc+CWT/06GD87aFCmW/bcuWztuWKJH1dm7q3bu36ty5s1JKKbvdrpYvX66CgoLUsGHDMp4vXbq0Sk5OzvibmTNnqho1aii73Z7xWHJysgoODlZLly5VSilVpkwZ9dFHH2U8n5qaqsqVK5fxXkop1bJlSzV48GCllFIxMTEKgFq+fHmWcf7zzz8KgLp8+XLGY0lJSapQoUI35Dx9+/ZVjz/+uFJKqREjRqjatWs7PT98+PAbXiuzihUrqgkTJmT7fGYDBw5U3bp1U0opdfHiRQVArVy5Mstt77//fjV27Finx2bOnKnKlCmTcR+Aevnll3N9X8fPMC0tTc2cOVMBUF9++aVatmyZ8vf3V8ePH8/Yfs+ePQqA2rhxo1JKqaFDh6qOHTsqpZT67LPP1KOPPqrq1aun/vzzT6WUUlWrVlVff/11Roy5fe9Z7S+Z5XS8xMXFuZyHFvBcCm+cESNGYOjQoRn3r1696tRFwKqGDQOeeAK4806zIyEiIiIi8k0LFy5ESEgIUlNTYbfb8cQTT2DMmDEZz9epUweBgYEZ93fs2IGDBw/eML46KSkJhw4dQlxcHM6cOYMmTZpkPFegQAE0atTohu7jmu3bt8Pf3z+j9dQVBw8eREJCAh544AGnx1NSUlC/fn0AwL59+5ziAIBmzZq5/B7ZmTRpEr777jscP34ciYmJSElJwZ3/n5SEh4ejT58+aNu2LR544AFERUWhR48eKFOmDAD5/NauXevUgp2eno6kpCQkJCSgUKFCAIBGjRq5FMtXX32Fb775BikpKfD398eQIUPQv39/fPnllyhfvrxTXle7dm0ULVoU+/btQ+PGjdGyZUt8++23SE9PR3R0NNq0aYOIiAisXLkSdevWxcGDB9GqVauMuHP63jWZ9xdPMSXRLlGiBPz9/TP632vOnj2LiIiIG7YPCgpCUFCQt8IzjMPwASIiIiIi6/n/LrhZ8vd3vp/TpMV+mUak5nOcsaPWrVtj8uTJCAwMRGRkJAoUcE5hChcu7HQ/Pj4eDRs2xI8//njDa5UsWTJPMQQHB7v9N1r35kWLFqFs2bJOz3kyt5kzZw6GDRuGTz75BM2aNUORIkXw8ccfY8OGDRnbTJs2DS+99BKWLFmCuXPn4s0338Ty5cvRtGlTxMfH4+2330bXrl1veO2CBQtm/J75c89Oz5498cYbbyA4OBhlypSBX+Z9JQctWrTAtWvXsHXrVqxatQpjx45FREQEPvjgA9SrVw+RkZGoVq0aANe/d1fjzi9TEu3AwEA0bNgQK1asyFirzm63Y8WKFRg0aJAZIRERERER3XrcSTo8tW2uL1UYVatWdXn7Bg0aYO7cuShVqhRCQ0Oz3KZMmTLYsGEDWrRoAUDGLW/ZsgUNGjTIcvs6derAbrcjOjraaZ4pjdZCmp6envFY7dq1ERQUhOPHj2fbEl6rVq2MicE069evz/2fzMHatWtx9913Y8CAARmPObboaurXr4/69etjxIgRaNasGWbNmoWmTZuiQYMGiImJceszz0lYWFiWr1WrVi2cOHECJ06cyGjV3rt3L65cuYLatWsDAIoWLYq6deviyy+/REBAAGrWrIlSpUrh0UcfxcKFC50+V1e+d28ybdbxoUOH4n//+x++//577Nu3D/3798f169fx9NNPmxUSERERERH5uJ49e6JEiRLo3LkzVq9ejSNHjmDlypV46aWXcPLkSQDA4MGD8cEHH2DBggXYv38/BgwYkOMa2JUqVULv3r3xzDPPYMGCBRmvqU0wVrFiRdhsNixcuBDnz59HfHw8ihQpgmHDhmHIkCH4/vvvcejQIWzduhUTJ07E999/DwB44YUXcODAAbz66quIiYnBrFmzMH36dJf+z1OnTmH79u1OP5cvX0a1atWwefNmLF26FP/99x/eeustbNq0KePvjhw5ghEjRmDdunU4duwYli1bhgMHDqBWrVoAgFGjRmHGjBl4++23sWfPHuzbtw9z5szBm2++mYdvI3tRUVGoU6cOevbsia1bt2Ljxo3o1asXWrZs6dQtvVWrVvjxxx8zkurw8HDUqlULc+fOdUq0Xfnevcm0RPvRRx/F+PHjMWrUKNx5553Yvn07lixZgtKlS5sVEhERERER+bhChQph1apVqFChArp27YpatWqhb9++SEpKymjpfOWVV/DUU0+hd+/eGd2rH3744Rxfd/LkyejevTsGDBiAmjVr4rnnnsP1/59JvWzZsnj77bfx+uuvo3Tp0hm9dN9991289dZbGDduHGrVqoV27dph0aJFqFy5MgCgQoUKmDdvHhYsWIB69ephypQpGDt2rEv/5/jx4zNapbWfRYsW4fnnn0fXrl3x6KOPokmTJrh48aJT63ahQoWwf/9+dOvWDdWrV0e/fv0wcOBAPP/88wCAtm3bYuHChVi2bBkaN26Mpk2bYsKECahYsaJ7X0QubDYbfvvtNxQrVgwtWrRAVFQUqlSpgrlz5zpt17JlS6Snp2eMxQYk+c78mCvfuzfZVHYj/i3s6tWrCAsLQ1xcnCW6BRARERERWVVSUhKOHDmCypUrO42xJaIb5XS8uJOHmtaiTURERERERHQzYqJNREREREREZCAm2kREREREREQGYqJNREREREREZCAm2kREREREREQGYqJNRERERHQLsNvtZodAZHlGHScFDHkVIiIiIiKypMDAQPj5+eH06dMoWbIkAgMDYbPZzA6LyFKUUkhJScH58+fh5+eHwMDAfL0eE20iIiIiopuYn58fKleujDNnzuD06dNmh0NkaYUKFUKFChXg55e/zt9MtImIiIiIbnKBgYGoUKEC0tLSkJ6ebnY4RJbk7++PAgUKGNLjg4k2EREREdEtwGazISAgAAEBAWaHQnTT42RoRERERERERAZiok1ERERERERkICbaRERERERERAbyyTHaSikAwNWrV02OhIiIiIiIiG4FWv6p5aM58clE+9q1awCA8uXLmxwJERERERER3UquXbuGsLCwHLexKVfScYux2+04ffo0ihQpYsjU655y9epVlC9fHidOnEBoaKjZ4RB5Ffd/ulVx36dbFfd9ulVx3791KKVw7do1REZG5rrOtk+2aPv5+aFcuXJmh+Gy0NBQHnR0y+L+T7cq7vt0q+K+T7cq7vu3htxasjWcDI2IiIiIiIjIQEy0iYiIiIiIiAzERNuDgoKCMHr0aAQFBZkdCpHXcf+nWxX3fbpVcd+nWxX3fcqKT06GRkRERERERGRVbNEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbSIiIiIiIiIDMdEmIiIiIiIiMhATbQ+aNGkSKlWqhIIFC6JJkybYuHGj2SERGWrMmDGw2WxOPzVr1sx4PikpCQMHDkTx4sUREhKCbt264ezZsyZGTJQ3q1atwkMPPYTIyEjYbDYsWLDA6XmlFEaNGoUyZcogODgYUVFROHDggNM2ly5dQs+ePREaGoqiRYuib9++iI+P9+J/QZQ3ue3/ffr0ueFa0K5dO6dtuP+Trxk3bhwaN26MIkWKoFSpUujSpQtiYmKctnGlnHP8+HF07NgRhQoVQqlSpfDqq68iLS3Nm/8KmYSJtofMnTsXQ4cOxejRo7F161bUq1cPbdu2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "from scipy.optimize import least_squares\n", + "import matplotlib.pyplot as plt\n", + "\n", + "class FourierSeriesGeneratorInverse(FourierSeriesGenerator):\n", + "\n", + " def fourier_series(self, x, params, rescale_amplitude=50, mean_value=None):\n", + " x = self._normalize(x)\n", + "\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(self._rescale(n, 0, 10))\n", + " freq = self._rescale(freq, 0, 10)\n", + " amplitude = self._rescale(amplitude, 0, 10)\n", + " phase = self._rescale(phase, 0, 10000)\n", + " trend = self._rescale(trend, -500, 500)\n", + " seasonality = self._rescale(seasonality, 0, 200)\n", + "\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + mean_value # defaulting to mean_value\n", + " else:\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + mean_value\n", + "\n", + " y += trend * x\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + " return y\n", + "\n", + " def objective_function(self, params, x, target_output):\n", + " y = self.fourier_series(x, params, mean_value=np.mean(target_output))\n", + " return y - target_output\n", + "\n", + " def find_parameters(self, x, target_output, initial_guess):\n", + " # Set the bounds for each of the parameters\n", + " lower_bounds = [0, 0, 0, 0, -1, 0]\n", + " upper_bounds = [10, 10, 10, 10000, 1, 200]\n", + " \n", + " result = least_squares(self.objective_function, initial_guess, args=(x, target_output), bounds=(lower_bounds, upper_bounds))\n", + " return result.x\n", + "\n", + "# Use\n", + "generator = FourierSeriesGeneratorInverse()\n", + "\n", + "# Provided laser power\n", + "last_element = df[\"NLP_40\"].iloc[-1]\n", + "print(last_element)\n", + "num_rows = len(df)\n", + "print(num_rows)\n", + "x = np.linspace(0, int(last_element), num_rows)\n", + "given_laser_power = df[\"NLP_40\"] # Replace with your data\n", + "\n", + "# Adjust initial guess to be within bounds\n", + "initial_guess = [5, 1, 0.5, 0, 0, 0]\n", + "\n", + "# Find the parameters\n", + "optimized_params = generator.find_parameters(x, given_laser_power, initial_guess)\n", + "\n", + "print(optimized_params)\n", + "\n", + "# Now to plot:\n", + "mean_value = np.mean(given_laser_power)\n", + "predicted_output = generator.fourier_series(x, optimized_params, mean_value=mean_value)\n", + "\n", + "plt.figure(figsize=(12, 6))\n", + "plt.plot(x, given_laser_power, label='Given Laser Power', color='blue')\n", + "plt.plot(x, predicted_output, label='Predicted Laser Power', color='red', linestyle='--')\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data and Laser Power Location" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "input_data_dir = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "sim_dir_name = \"thin_wall\"\n", + "laser_file = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP_2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initiate the FEAModel" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.3773400783538818\n", + "Time of calculating critical timestep: 0.8901991844177246\n", + "Time of reading and interpolating toolpath: 0.03641104698181152\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 1.3159127235412598\n" + ] + } + ], + "source": [ + "sim_itr = rs.FeaModel(\n", + " input_data_dir= input_data_dir,\n", + " geom_dir=sim_dir_name,\n", + " laserpowerfile=laser_file, ## Laser input is given here\n", + " VtkOutputStep = 1.,\n", + " ZarrOutputStep = 0.02,\n", + " outputVtkFiles=True,\n", + " verbose=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.1674394607543945\n", + "Time of calculating critical timestep: 0.07886791229248047\n", + "Time of reading and interpolating toolpath: 0.03437995910644531\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.4650602340698242\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.06 s\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[66], line 18\u001b[0m\n\u001b[1;32m 15\u001b[0m simulator\u001b[39m.\u001b[39msetup_simulation()\n\u001b[1;32m 17\u001b[0m \u001b[39m# Run the simulation\u001b[39;00m\n\u001b[0;32m---> 18\u001b[0m simulator\u001b[39m.\u001b[39;49mrun_simulation()\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/gamma_model_simulator.py:34\u001b[0m, in \u001b[0;36mGammaModelSimulator.run_simulation\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrun_simulation\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 33\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39msim_itr:\n\u001b[0;32m---> 34\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49msim_itr\u001b[39m.\u001b[39;49mrun()\n\u001b[1;32m 35\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 36\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mSimulation is not setup yet. Call setup_simulation() first.\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/interface.py:123\u001b[0m, in \u001b[0;36mFeaModel.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 120\u001b[0m warnings\u001b[39m.\u001b[39mwarn(\u001b[39m\"\u001b[39m\u001b[39mWarning! Time steps of LP input are not well aligned with simulation steps\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 122\u001b[0m \u001b[39m# Run the solver\u001b[39;00m\n\u001b[0;32m--> 123\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mheat_solver\u001b[39m.\u001b[39;49mtime_integration()\n\u001b[1;32m 125\u001b[0m \u001b[39m# Save timestamped zarr file\u001b[39;00m\n\u001b[1;32m 126\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\u001b[39m.\u001b[39mcurrent_sim_time \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mZarrOutputTimes[\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mZarrFileNum] \u001b[39m-\u001b[39m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\u001b[39m.\u001b[39mdt\u001b[39m/\u001b[39m\u001b[39m10\u001b[39m)):\n\u001b[1;32m 127\u001b[0m \n\u001b[1;32m 128\u001b[0m \u001b[39m# Free unused memory blocks\u001b[39;00m\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/simulator/gamma.py:735\u001b[0m, in \u001b[0;36mheat_solve_mgr.time_integration\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 733\u001b[0m domain \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\n\u001b[1;32m 734\u001b[0m domain\u001b[39m.\u001b[39mupdate_birth()\n\u001b[0;32m--> 735\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mupdate_cp_cond()\n\u001b[1;32m 736\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mupdate_mvec_stifness()\n\u001b[1;32m 738\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlaser_loc \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mtoolpath[\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcurrent_step,\u001b[39m0\u001b[39m:\u001b[39m3\u001b[39m]\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/simulator/gamma.py:646\u001b[0m, in \u001b[0;36mheat_solve_mgr.update_cp_cond\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 644\u001b[0m matID \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m0\u001b[39m]\n\u001b[1;32m 645\u001b[0m mat \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39melement_mat \u001b[39m==\u001b[39m matID\n\u001b[0;32m--> 646\u001b[0m thetaIp \u001b[39m=\u001b[39m temperature_ip[domain\u001b[39m.\u001b[39;49mactive_elements\u001b[39m*\u001b[39;49mmat]\n\u001b[1;32m 648\u001b[0m solidus \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m2\u001b[39m]\n\u001b[1;32m 649\u001b[0m liquidus \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m3\u001b[39m]\n", + "File \u001b[0;32mcupy/_core/core.pyx:1526\u001b[0m, in \u001b[0;36mcupy._core.core._ndarray_base.__getitem__\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:42\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._ndarray_getitem\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:770\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._getitem_mask_single\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:754\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._prepare_mask_indexing_single\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_manipulation.pyx:479\u001b[0m, in \u001b[0;36mcupy._core._routines_manipulation.broadcast_to\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32m~/miniconda3/envs/gamma/lib/python3.10/site-packages/numpy/lib/function_base.py:385\u001b[0m, in \u001b[0;36miterable\u001b[0;34m(y)\u001b[0m\n\u001b[1;32m 348\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 349\u001b[0m \u001b[39mCheck whether or not an object can be iterated over.\u001b[39;00m\n\u001b[1;32m 350\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 382\u001b[0m \n\u001b[1;32m 383\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 384\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 385\u001b[0m \u001b[39miter\u001b[39;49m(y)\n\u001b[1;32m 386\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mTypeError\u001b[39;00m:\n\u001b[1;32m 387\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mFalse\u001b[39;00m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from gamma_model_simulator import GammaModelSimulator\n", + "\n", + "# Define your parameters\n", + "INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "SIM_DIR_NAME = \"thin_wall\"\n", + "LASER_FILE = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + "\n", + "# Create an instance of the simulator\n", + "simulator = GammaModelSimulator(\n", + " input_data_dir=INPUT_DATA_DIR,\n", + " sim_dir_name=SIM_DIR_NAME,\n", + " laser_file=LASER_FILE)\n", + "\n", + "# Set up the simulation\n", + "simulator.setup_simulation()\n", + "\n", + "# Run the simulation\n", + "simulator.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open the Output File" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type : zarr.core.Array\n", + "Data type : float64\n", + "Shape : (14252, 96874)\n", + "Chunk shape : (1, 96874)\n", + "Order : C\n", + "Read-only : True\n", + "Compressor : None\n", + "Store type : zarr.storage.DirectoryStore\n", + "No. bytes : 11045185984 (10.3G)\n", + "No. bytes stored : 11044411221 (10.3G)\n", + "Storage ratio : 1.0\n", + "Chunks initialized : 14251/14252\n", + "\n", + " 0 1 2 3 4 5 6 7 8 9 ... \\\n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", + "1 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "2 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "3 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "4 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "\n", + " 96864 96865 96866 96867 96868 96869 96870 96871 96872 96873 \n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "2 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "3 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "4 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "\n", + "[5 rows x 96874 columns]\n" + ] + } + ], + "source": [ + "import zarr\n", + "import pandas as pd\n", + "\n", + "\n", + "# Path to the zarr file\n", + "zarr_location = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP_2.zarr/ff_dt_temperature\"\n", + "\n", + "# Open the zarr file\n", + "zarr_array = zarr.open(zarr_location, mode='r')\n", + "\n", + "# Now, you can access the contents of the zarr file through zarr_array like a numpy array.\n", + "print(zarr_array.info)\n", + "\n", + "# Convert the zarr array into a pandas DataFrame\n", + "df = pd.DataFrame(zarr_array[:])\n", + "\n", + "print(df.head()) # Display the first few rows of the DataFrame\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code to calculate the heat treatment time" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 46%|████▌ | 44734/96874 [00:16<00:19, 2678.65it/s]" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAHWCAYAAACBjZMqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAADBH0lEQVR4nOzdd3gUZdfA4d/29ISQkBAIJPQioUuT3oNI8wMEpYiCvaJY6NgAQUAsKC+IvPgCKiIqUkQRBKQ3Aek9hJrets33x2Y32WRTSYFw7uvKBTtzZvbZmZ3ZOfOUUSmKoiCEEEIIIYQQokipS7sAQgghhBBCCFEWSbIlhBBCCCGEEMVAki0hhBBCCCGEKAaSbAkhhBBCCCFEMZBkSwghhBBCCCGKgSRbQgghhBBCCFEMJNkSQgghhBBCiGIgyZYQQgghhBBCFANJtoQQQgghhBCiGEiyJYQQQgDnzp1DpVLx1VdflXZRnMycOZNq1aqh0Who1KhRaRenSN2p21wIIYqKJFtCiDJBpVLl62/z5s2lXdRS8+mnn95zF7WTJ0/O1/eiQ4cOpV1UlzZs2MDrr79OmzZtWLx4Me+9916xvt+IESNQqVRERESgKEq2+SqViueee65Yy1CUTp8+jZubGyqVij179jjN++qrr3L8PkRHR2db15o1a2jSpAlubm5UqVKFSZMmYTabs8XFxsYyevRoAgMD8fT0pGPHjuzbty9b3Msvv0yTJk3w9/fHw8ODunXrMnnyZBITE4tuAwghSp22tAsghBBFYenSpU6vv/76azZu3Jhtet26dUuyWHeUTz/9lICAAEaMGFHaRSkx/fv3p0aNGo7XiYmJPP300/Tr14/+/fs7pgcFBVG1alVSUlLQ6XSlUVSXfv/9d9RqNf/5z3/Q6/Ul9r6HDx9m1apVDBgwoMTeszi8/PLLaLVa0tLScoyZOnUq4eHhTtP8/PycXv/666/07duXDh068PHHH3P48GHeeecdrl27xmeffeaIs1qt9OrVi4MHD/Laa68REBDAp59+SocOHdi7dy81a9Z0xO7evZu2bdsycuRI3Nzc2L9/Px988AG//fYbW7ZsQa2W++FClAWSbAkhyoRHH33U6fXff//Nxo0bs00vKxRFITU1FXd3dylHLiIiIoiIiHC8vnHjBk8//TQREREuvxtubm4lWbw8Xbt2DXd39yJLtPKzv9zd3QkNDWXq1Kn0798flUpVJO9d0tavX8/69et5/fXXeeedd3KM69mzJ82aNct1XWPHjiUiIoINGzag1dounXx8fHjvvfd48cUXqVOnDgDfffcd27dv59tvv+Xhhx8GYODAgdSqVYtJkybxzTffONb5119/ZXuf6tWrM3bsWHbt2kXLli0L/JmFEHceuW0ihLhnWK1W5syZQ/369XFzcyMoKIgxY8YQExPjFBcWFsaDDz7I5s2badasGe7u7jRo0MDRBHHVqlU0aNAANzc3mjZtyv79+52WHzFiBF5eXpw5c4bu3bvj6elJSEgIU6dOzdY0q6BlWr9+vaNMCxYsAGDx4sV06tSJChUqYDAYqFevntPddvvyR44c4c8//8zWdM7e1C4rezOrc+fO5ascsbGxvPTSS4SGhmIwGKhRowbTp0/HarXmul8efPBBqlWr5nJeq1atnC6EN27cyAMPPICfnx9eXl7Url2bt956K9f155er/kP2fXnhwgUefPBBvLy8qFSpEp988glgqwHq1KkTnp6eVK1a1eli2q6w20WlUrF48WKSkpIc+8xeNrPZzLRp06hevToGg4GwsDDeeuutbDU4ue2vnKjVasaPH8+hQ4f44Ycf8txu165dY9SoUQQFBeHm5kbDhg1ZsmSJy+0wYsQIfH198fPzY/jw4cTGxrpc57///svDDz+Mv78/bm5uNGvWjDVr1uRZFjuTycSLL77Iiy++SPXq1fOMT0hIwGKxuJx39OhRjh49yujRox2JFsAzzzyDoih89913jmnfffcdQUFBTrWmgYGBDBw4kB9//DHXGjaw7S8gx+0ihLj7SLIlhLhnjBkzhtdee402bdowd+5cRo4cybJly+jevTsmk8kp9tSpUwwZMoTevXvz/vvvExMTQ+/evVm2bBkvv/wyjz76KFOmTOH06dMMHDgw24WzxWKhR48eBAUFMWPGDJo2bcqkSZOYNGlSoct0/PhxHnnkEbp27crcuXMdgyV89tlnVK1albfeeotZs2YRGhrKM88840gIAObMmUPlypWpU6cOS5cuZenSpbz99tuF2o6uypGcnEz79u3573//y7Bhw5g3bx5t2rThzTff5JVXXsl1fYMGDeLs2bPs3r3bafr58+f5+++/GTx4MABHjhzhwQcfJC0tjalTpzJr1iweeughtm3bVqjPkV8Wi4WePXsSGhrKjBkzCAsL47nnnuOrr76iR48eNGvWjOnTp+Pt7c2wYcM4e/asY9nb2S5Lly6lbdu2GAwGxz5r164dAE888QQTJ06kSZMmfPTRR7Rv357333/fsa0yy+l7k5shQ4ZQs2ZNlzcIMktJSaFDhw4sXbqUoUOHMnPmTHx9fRkxYgRz5851xCmKQp8+fVi6dCmPPvoo77zzDpcuXWL48OHZ1nnkyBFatmzJsWPHeOONN5g1axaenp707ds3X8kf2L7vMTExjB8/Ps/Yjh074uPjg4eHBw899BAnT550mm+/mZK19iskJITKlSs73WzZv38/TZo0ydYE8P777yc5OZkTJ044TTebzdy4cYOoqCg2bNjA+PHj8fb25v7778/X5xRC3AUUIYQog5599lkl8ylu69atCqAsW7bMKW7dunXZpletWlUBlO3btzumrV+/XgEUd3d35fz5847pCxYsUADljz/+cEwbPny4AijPP/+8Y5rValV69eql6PV65fr164Uu07p167J91uTk5GzTunfvrlSrVs1pWv369ZX27dtni500aZLi6udg8eLFCqCcPXs2z3JMmzZN8fT0VE6cOOE0/Y033lA0Go1y4cKFbOu3i4uLUwwGg/Lqq686TZ8xY4aiUqkc2/ujjz5SAMf2K4zr168rgDJp0qRs886ePasAyuLFix3T7Pvyvffec0yLiYlR3N3dFZVKpSxfvtwx/d9//8227tvZLvb39/T0dJp24MABBVCeeOIJp+ljx45VAOX33393TMvte5PX+y1ZskQBlFWrVjnmA8qzzz7reD1nzhwFUP773/86phmNRqVVq1aKl5eXEh8fryiKoqxevVoBlBkzZjjizGaz0rZt22zbvHPnzkqDBg2U1NRUxzSr1aq0bt1aqVmzZp6f4cqVK4q3t7eyYMECRVEyvse7d+92iluxYoUyYsQIZcmSJcoPP/ygjB8/XvHw8FACAgKc9svMmTMVwOW+at68udKyZUvHa09PT+Xxxx/PFvfLL7+43A87duxQAMdf7dq1nc4lQoi7n9RsCSHuCd9++y2+vr507dqVGzduOP6aNm2Kl5cXf/zxh1N8vXr1aNWqleN1ixYtAOjUqRNVqlTJNv3MmTPZ3jPzqG32UdyMRiO//fZbocoUHh5O9+7ds71P5v43cXFx3Lhxg/bt23PmzBni4uLy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tIsiilCHDh1o1KgRc+bMKe2iFAtpRiiEECVE7VSzJc0IhbhXmEwmUlJS0Gq1uLu7F/ufVqslOTkZk8mUr/KpVKpc/yZPnly8G6iEqVQqVq9eXdrFKJTo6Ggee+wxgoOD8fT0pEmTJnz//fdOMfv27aNr1674+flRvnx5Ro8eTWJiomP+zZs36dGjByEhIRgMBkJDQ3nuueeIj48v6Y+Tb5988gl169bF3d2d2rVr8/XXXzvNN5lMTJ06lerVq+Pm5kbDhg1Zt26dU8xnn31GREQEPj4++Pj40KpVK3799ddiL7vUbAkhRAnJfD9bki0h7j06nQ6DwVAi72U2m/Mde+XKFcf/V6xYwcSJEzl+/LhjmpeXV5GWTRTesGHDiI2NZc2aNQQEBPDNN98wcOBA9uzZQ+PGjYmKiqJLly4MGjSI+fPnEx8fz0svvcSIESP47rvvAFCr1fTp04d33nmHwMBATp06xbPPPsutW7f45ptvSvkTZvfZZ5/x5ptv8uWXX9K8eXN27drFk08+Sbly5ejduzcA48eP57///S9ffvklderUYf369fTr14/t27fTuHFjACpXrswHH3xAzZo1URSFJUuW0KdPH/bv30/9+vWLrfxSsyWEECUkazNCIYS4EwQHBzv+fH19UalUTtOWL19O3bp1cXNzo06dOnz66aeOZc+dO4dKpWLlypW0bdsWd3d3mjdvzokTJ9i9ezfNmjXDy8uLnj17cv36dcdyI0aMoG/fvkyZMoXAwEB8fHx46qmnMBqNeZZ39erV1KxZEzc3N7p3787Fixed5v/44480adIENzc3qlWrxpQpUxzJZ1hYGAD9+vVDpVIRFhZGXFwcGo2GPXv2AGC1WvH396dly5aOdf73v/8lNDTU8frixYsMHDgQPz8//P396dOnD+fOnXMqx8KFC/PcbqtWraJjx454eHjQsGFDduzYketn3759O88//zz3338/1apVY/z48fj5+bF3714Afv75Z3Q6HZ988gm1a9emefPmfP7553z//fecOnUKgHLlyvH000/TrFkzqlatSufOnXnmmWfYunVrru89btw4atWqhYeHB9WqVWPChAlOtaeTJ0+mUaNGLF26lLCwMHx9fRk8eDAJCQmOmKSkJIYNG4aXlxcVK1Zk1qxZub4nwNKlSxkzZgyDBg2iWrVqDB48mNGjRzN9+nSn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4MBljz8qKsrhWA8cOKDExESH8UlJSQ7309PT9ctf/lLJycl65plnavw/8PPzsx8bAMAcNMgAADQ4PyxWLBaLw7aqAqmqffm5c+c0cuRI/e53v6v2XFXFyg+FhYWpqKhIJSUl8vX1lSQFBQVp586dWrdunVatWqWZM2dq9uzZ2rZtm86dOydJev/999WyZUuH57LZbJIqC5j6cKVjrY3Zs2fr7rvv1vvvv68PPvhAs2bN0ptvvqnbb7/dPubUqVNq0aJFvcQLAKgZM1sAALfXq1cv7du3T23atNE111zjcAsICKjxMT169JAk7d+/32G7t7e3kpOTNX/+fGVnZ+vIkSNau3at4uPjZbPZlJeXV+01YmJiJFXOSH3yyScqLS2t9nrBwcGKjo7Wxo0bHbZv3LhR8fHxtT7Wzp07a8uWLQ7bNm/eXG1chw4dNHXqVK1atUqjRo3SwoUL7fsuXryo3Nxc9ezZs9avCwCoO4otAIDbS01N1alTpzR27Fht27ZNubm5+vDDD3XvvfeqvLy8xse0aNFCvXr10oYNG+zbli9frueff167d+/W0aNH9dprr6miokIdO3ZUUFCQHnvsMU2dOlWvvvqqcnNztXPnTr3wwgt69dVXJUlpaWkqLCzUXXfdpe3bt+vgwYN6/fXX7e3up02bpt/97ndatmyZcnJy9Pjjj2v37t16+OGHa32sDz30kFauXKk//OEPOnjwoP7v//7PoaPhhQsXlJaWpnXr1uno0aPauHGjtm3bps6dO9vHbN68WTabrdryQwBA/aLYAgC4vaoZo/LycqWkpCghIUGPPPKIQkND5eV1+R91v/zlLx0u7hsaGqq3335bgwcPVufOnfXSSy9p6dKl6tKliyRp3rx5euqpp5SRkaHOnTtr2LBhev/99xUXFydJat68udauXatz587phhtuUO/evfXyyy/blwU+9NBDSk9P16OPPqqEhAStXLlS//nPf9S+fftaH2u/fv308ssv67nnnlP37t21atUqPfnkk/b9VqtVJ0+e1D333KMOHTrozjvv1PDhwzVnzhz7mKVLl2rcuHHy9/ev9esCAOrOYhiG4eogAABwhQsXLqhjx45atmyZx8zynDhxQh07dtT27dvtRSIAwBzMbAEAPJafn59ee+21K178uLE5cuSIXnzxRQotAHACZrYAAAAAwATMbAEAAACACSi2AAAAAMAEFFsAAAAAYAKKLQAAAAAwAcUWAAAAAJiAYgsAAAAATECxBQAAAAAmoNgCAAAAABNQbAEAAACACf4/PH59L9YZty4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:35<00:00, 2721.67it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The average time taken between temperatures 893-993 for all nodes is: 30.059493775419615 seconds.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\n", + "def calculate_time(df, min_temp, max_temp, selected_nodes, collection_rate=0.02, plot_graph=False):\n", + " total_time_list = []\n", + " \n", + " for column in tqdm(df.columns, desc=\"Processing nodes\"):\n", + " time_axis = np.arange(0, df[column].size * collection_rate, collection_rate)\n", + " \n", + " # Find indices where temperature is within the desired range\n", + " in_range_indices = np.where((df[column] >= min_temp) & (df[column] <= max_temp))[0]\n", + " \n", + " # Check if there are any in-range values\n", + " if len(in_range_indices) == 0:\n", + " total_time_list.append(0)\n", + " continue\n", + "\n", + " # Calculate time between first and last in-range value for this column\n", + " time_diff = (in_range_indices[-1] - in_range_indices[0]) * collection_rate\n", + " total_time_list.append(time_diff)\n", + " \n", + " # If plotting is enabled and this column is one of the selected nodes, then plot\n", + " if plot_graph and str(column) in selected_nodes:\n", + " plt.figure(figsize=(10,5))\n", + " plt.plot(time_axis, df[column], label=f\"Node {column}\")\n", + " if len(in_range_indices) > 0:\n", + " plt.fill_between(time_axis, \n", + " min_temp, \n", + " max_temp, \n", + " where=((df[column] >= min_temp) & (df[column] <= max_temp)),\n", + " color='gray', alpha=0.5, label=f\"Temp between {min_temp} and {max_temp}\")\n", + " \n", + " # Adding horizontal lines for min and max temperature\n", + " plt.axhline(min_temp, color='red', linestyle='--', label=f\"Min Temp {min_temp}\")\n", + " plt.axhline(max_temp, color='blue', linestyle='--', label=f\"Max Temp {max_temp}\")\n", + "\n", + " plt.xlabel(\"Time (seconds)\")\n", + " plt.ylabel(\"Temperature\")\n", + " plt.title(f\"Temperature vs Time for Node {column}\")\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()\n", + " \n", + " return np.mean(total_time_list)\n", + "\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "avg_time = calculate_time(df, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Objective Function" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.5523247718811035\n", + "Time of calculating critical timestep: 0.07913565635681152\n", + "Time of reading and interpolating toolpath: 0.036163330078125\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.46532511711120605\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.04 s\n", + "Simulation time: 2.0 s, Percentage done: 0.702%, Elapsed Time: 18.2 s\n", + "Simulation time: 3.0 s, Percentage done: 1.05%, Elapsed Time: 27.3 s\n", + "Simulation time: 4.0 s, Percentage done: 1.4%, Elapsed Time: 36.6 s\n", + "Simulation time: 5.0 s, Percentage done: 1.75%, Elapsed Time: 45.9 s\n", + "Simulation time: 6.0 s, Percentage done: 2.11%, Elapsed Time: 55.3 s\n", + "Simulation time: 7.0 s, Percentage done: 2.46%, Elapsed Time: 64.8 s\n", + "Simulation time: 8.0 s, Percentage done: 2.81%, Elapsed Time: 74.3 s\n", + "Simulation time: 9.0 s, Percentage done: 3.16%, Elapsed Time: 83.9 s\n", + "Simulation time: 1e+01 s, Percentage done: 3.51%, Elapsed Time: 93.5 s\n", + "Simulation time: 1.1e+01 s, Percentage done: 3.86%, Elapsed Time: 1.03e+02 s\n", + "Simulation time: 1.2e+01 s, Percentage done: 4.21%, Elapsed Time: 1.13e+02 s\n", + "Simulation time: 1.3e+01 s, Percentage done: 4.56%, Elapsed Time: 1.23e+02 s\n", + "Simulation time: 1.4e+01 s, Percentage done: 4.91%, Elapsed Time: 1.33e+02 s\n", + "Simulation time: 1.5e+01 s, Percentage done: 5.26%, Elapsed Time: 1.43e+02 s\n", + "Simulation time: 1.6e+01 s, Percentage done: 5.61%, Elapsed Time: 1.52e+02 s\n", + "Simulation time: 1.7e+01 s, Percentage done: 5.96%, Elapsed Time: 1.62e+02 s\n", + "Simulation time: 1.8e+01 s, Percentage done: 6.32%, Elapsed Time: 1.73e+02 s\n", + "Simulation time: 1.9e+01 s, Percentage done: 6.67%, Elapsed Time: 1.83e+02 s\n", + "Simulation time: 2e+01 s, Percentage done: 7.02%, Elapsed Time: 1.93e+02 s\n", + "Simulation time: 2.1e+01 s, Percentage done: 7.37%, Elapsed Time: 2.03e+02 s\n", + "Simulation time: 2.2e+01 s, Percentage done: 7.72%, Elapsed Time: 2.13e+02 s\n", + "Simulation time: 2.3e+01 s, Percentage done: 8.07%, Elapsed Time: 2.24e+02 s\n", + "Simulation time: 2.4e+01 s, Percentage done: 8.42%, Elapsed Time: 2.34e+02 s\n", + "Simulation time: 2.5e+01 s, Percentage done: 8.77%, Elapsed Time: 2.44e+02 s\n", + "Simulation time: 2.6e+01 s, Percentage done: 9.12%, Elapsed Time: 2.55e+02 s\n", + "Simulation time: 2.7e+01 s, Percentage done: 9.47%, Elapsed Time: 2.65e+02 s\n", + "Simulation time: 2.8e+01 s, Percentage done: 9.82%, Elapsed Time: 2.76e+02 s\n", + "Simulation time: 2.9e+01 s, Percentage done: 10.2%, Elapsed Time: 2.86e+02 s\n", + "Simulation time: 3e+01 s, Percentage done: 10.5%, Elapsed Time: 2.97e+02 s\n", + "Simulation time: 3.1e+01 s, Percentage done: 10.9%, Elapsed Time: 3.08e+02 s\n", + "Simulation time: 3.2e+01 s, Percentage done: 11.2%, Elapsed Time: 3.19e+02 s\n", + "Simulation time: 3.3e+01 s, Percentage done: 11.6%, Elapsed Time: 3.29e+02 s\n", + "Simulation time: 3.4e+01 s, Percentage done: 11.9%, Elapsed Time: 3.41e+02 s\n", + "Simulation time: 3.5e+01 s, Percentage done: 12.3%, Elapsed Time: 3.52e+02 s\n", + "Simulation time: 3.6e+01 s, Percentage done: 12.6%, Elapsed Time: 3.63e+02 s\n", + "Simulation time: 3.7e+01 s, Percentage done: 13.0%, Elapsed Time: 3.74e+02 s\n", + "Simulation time: 3.8e+01 s, Percentage done: 13.3%, Elapsed Time: 3.85e+02 s\n", + "Simulation time: 3.9e+01 s, Percentage done: 13.7%, Elapsed Time: 3.96e+02 s\n", + "Simulation time: 4e+01 s, Percentage done: 14.0%, Elapsed Time: 4.07e+02 s\n", + "Simulation time: 4.1e+01 s, Percentage done: 14.4%, Elapsed Time: 4.18e+02 s\n", + "Simulation time: 4.2e+01 s, Percentage done: 14.7%, Elapsed Time: 4.29e+02 s\n", + "Simulation time: 4.3e+01 s, Percentage done: 15.1%, Elapsed Time: 4.41e+02 s\n", + "Simulation time: 4.4e+01 s, Percentage done: 15.4%, Elapsed Time: 4.52e+02 s\n", + "Simulation time: 4.5e+01 s, Percentage done: 15.8%, Elapsed Time: 4.64e+02 s\n", + "Simulation time: 4.6e+01 s, Percentage done: 16.1%, Elapsed Time: 4.75e+02 s\n", + "Simulation time: 4.7e+01 s, Percentage done: 16.5%, Elapsed Time: 4.87e+02 s\n", + "Simulation time: 4.8e+01 s, Percentage done: 16.8%, Elapsed Time: 4.98e+02 s\n", + "Simulation time: 4.9e+01 s, Percentage done: 17.2%, Elapsed Time: 5.1e+02 s\n", + "Simulation time: 5e+01 s, Percentage done: 17.5%, Elapsed Time: 5.21e+02 s\n", + "Simulation time: 5.1e+01 s, Percentage done: 17.9%, Elapsed Time: 5.33e+02 s\n", + "Simulation time: 5.2e+01 s, Percentage done: 18.2%, Elapsed Time: 5.45e+02 s\n", + "Simulation time: 5.3e+01 s, Percentage done: 18.6%, Elapsed Time: 5.57e+02 s\n", + "Simulation time: 5.4e+01 s, Percentage done: 18.9%, Elapsed Time: 5.69e+02 s\n", + "Simulation time: 5.5e+01 s, Percentage done: 19.3%, Elapsed Time: 5.8e+02 s\n", + "Simulation time: 5.6e+01 s, Percentage done: 19.6%, Elapsed Time: 5.92e+02 s\n", + "Simulation time: 5.7e+01 s, Percentage done: 20.0%, Elapsed Time: 6.04e+02 s\n", + "Simulation time: 5.8e+01 s, Percentage done: 20.4%, Elapsed Time: 6.16e+02 s\n", + "Simulation time: 5.9e+01 s, Percentage done: 20.7%, Elapsed Time: 6.29e+02 s\n", + "Simulation time: 6e+01 s, Percentage done: 21.1%, Elapsed Time: 6.41e+02 s\n", + "Simulation time: 6.1e+01 s, Percentage done: 21.4%, Elapsed Time: 6.53e+02 s\n", + "Simulation time: 6.2e+01 s, Percentage done: 21.8%, Elapsed Time: 6.66e+02 s\n", + "Simulation time: 6.3e+01 s, Percentage done: 22.1%, Elapsed Time: 6.78e+02 s\n", + "Simulation time: 6.4e+01 s, Percentage done: 22.5%, Elapsed Time: 6.9e+02 s\n", + "Simulation time: 6.5e+01 s, Percentage done: 22.8%, Elapsed Time: 7.03e+02 s\n", + "Simulation time: 6.6e+01 s, Percentage done: 23.2%, Elapsed Time: 7.15e+02 s\n", + "Simulation time: 6.7e+01 s, Percentage done: 23.5%, Elapsed Time: 7.27e+02 s\n", + "Simulation time: 6.8e+01 s, Percentage done: 23.9%, Elapsed Time: 7.4e+02 s\n", + "Simulation time: 6.9e+01 s, Percentage done: 24.2%, Elapsed Time: 7.52e+02 s\n", + "Simulation time: 7e+01 s, Percentage done: 24.6%, Elapsed Time: 7.65e+02 s\n", + "Simulation time: 7.1e+01 s, Percentage done: 24.9%, Elapsed Time: 7.78e+02 s\n", + "Simulation time: 7.2e+01 s, Percentage done: 25.3%, Elapsed Time: 7.9e+02 s\n", + "Simulation time: 7.3e+01 s, Percentage done: 25.6%, Elapsed Time: 8.03e+02 s\n", + "Simulation time: 7.4e+01 s, Percentage done: 26.0%, Elapsed Time: 8.16e+02 s\n", + "Simulation time: 7.5e+01 s, Percentage done: 26.3%, Elapsed Time: 8.29e+02 s\n", + "Simulation time: 7.6e+01 s, Percentage done: 26.7%, Elapsed Time: 8.41e+02 s\n", + "Simulation time: 7.7e+01 s, Percentage done: 27.0%, Elapsed Time: 8.54e+02 s\n", + "Simulation time: 7.8e+01 s, Percentage done: 27.4%, Elapsed Time: 8.67e+02 s\n", + "Simulation time: 7.9e+01 s, Percentage done: 27.7%, Elapsed Time: 8.8e+02 s\n", + "Simulation time: 8e+01 s, Percentage done: 28.1%, Elapsed Time: 8.94e+02 s\n", + "Simulation time: 8.1e+01 s, Percentage done: 28.4%, Elapsed Time: 9.07e+02 s\n", + "Simulation time: 8.2e+01 s, Percentage done: 28.8%, Elapsed Time: 9.2e+02 s\n", + "Simulation time: 8.3e+01 s, Percentage done: 29.1%, Elapsed Time: 9.33e+02 s\n", + "Simulation time: 8.4e+01 s, Percentage done: 29.5%, Elapsed Time: 9.47e+02 s\n", + "Simulation time: 8.5e+01 s, Percentage done: 29.8%, Elapsed Time: 9.6e+02 s\n", + "Simulation time: 8.6e+01 s, Percentage done: 30.2%, Elapsed Time: 9.73e+02 s\n", + "Simulation time: 8.7e+01 s, Percentage done: 30.5%, Elapsed Time: 9.87e+02 s\n", + "Simulation time: 8.8e+01 s, Percentage done: 30.9%, Elapsed Time: 1e+03 s\n", + "Simulation time: 8.9e+01 s, Percentage done: 31.2%, Elapsed Time: 1.01e+03 s\n", + "Simulation time: 9e+01 s, Percentage done: 31.6%, Elapsed Time: 1.03e+03 s\n", + "Simulation time: 9.1e+01 s, Percentage done: 31.9%, Elapsed Time: 1.04e+03 s\n", + "Simulation time: 9.2e+01 s, Percentage done: 32.3%, Elapsed Time: 1.05e+03 s\n", + "Simulation time: 9.3e+01 s, Percentage done: 32.6%, Elapsed Time: 1.07e+03 s\n", + "Simulation time: 9.4e+01 s, Percentage done: 33.0%, Elapsed Time: 1.08e+03 s\n", + "Simulation time: 9.5e+01 s, Percentage done: 33.3%, Elapsed Time: 1.1e+03 s\n", + "Simulation time: 9.6e+01 s, Percentage done: 33.7%, Elapsed Time: 1.11e+03 s\n", + "Simulation time: 9.7e+01 s, Percentage done: 34.0%, Elapsed Time: 1.12e+03 s\n", + "Simulation time: 9.8e+01 s, Percentage done: 34.4%, Elapsed Time: 1.14e+03 s\n", + "Simulation time: 9.9e+01 s, Percentage done: 34.7%, Elapsed Time: 1.15e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 35.1%, Elapsed Time: 1.17e+03 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vnk3019/ded_dt_thermomechanical_solver/src/gamma/interface.py:120: UserWarning: Warning! Time steps of LP input are not well aligned with simulation steps\n", + " warnings.warn(\"Warning! Time steps of LP input are not well aligned with simulation steps\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation time: 1e+02 s, Percentage done: 35.4%, Elapsed Time: 1.18e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 35.8%, Elapsed Time: 1.19e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.1%, Elapsed Time: 1.21e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.5%, Elapsed Time: 1.22e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.8%, Elapsed Time: 1.24e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.2%, Elapsed Time: 1.25e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.5%, Elapsed Time: 1.27e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.9%, Elapsed Time: 1.28e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.2%, Elapsed Time: 1.3e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.6%, Elapsed Time: 1.31e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.9%, Elapsed Time: 1.32e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 39.3%, Elapsed Time: 1.34e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 39.6%, Elapsed Time: 1.35e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 40.0%, Elapsed Time: 1.37e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 40.4%, Elapsed Time: 1.38e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 40.7%, Elapsed Time: 1.4e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.1%, Elapsed Time: 1.41e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.4%, Elapsed Time: 1.43e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.8%, Elapsed Time: 1.44e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.1%, Elapsed Time: 1.46e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.5%, Elapsed Time: 1.47e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.8%, Elapsed Time: 1.49e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.2%, Elapsed Time: 1.5e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.5%, Elapsed Time: 1.52e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.9%, Elapsed Time: 1.53e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.2%, Elapsed Time: 1.55e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.6%, Elapsed Time: 1.57e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.9%, Elapsed Time: 1.58e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 45.3%, Elapsed Time: 1.6e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 45.6%, Elapsed Time: 1.61e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.0%, Elapsed Time: 1.63e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.3%, Elapsed Time: 1.64e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.7%, Elapsed Time: 1.66e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 47.0%, Elapsed Time: 1.68e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 47.4%, Elapsed Time: 1.69e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 47.7%, Elapsed Time: 1.71e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.1%, Elapsed Time: 1.72e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.4%, Elapsed Time: 1.74e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.8%, Elapsed Time: 1.76e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.1%, Elapsed Time: 1.77e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.5%, Elapsed Time: 1.79e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.8%, Elapsed Time: 1.8e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.2%, Elapsed Time: 1.82e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.5%, Elapsed Time: 1.84e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.9%, Elapsed Time: 1.85e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.2%, Elapsed Time: 1.87e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.6%, Elapsed Time: 1.89e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.9%, Elapsed Time: 1.9e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 52.3%, Elapsed Time: 1.92e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 52.6%, Elapsed Time: 1.93e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.0%, Elapsed Time: 1.95e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.3%, Elapsed Time: 1.97e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.7%, Elapsed Time: 1.99e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 54.0%, Elapsed Time: 2e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 54.4%, Elapsed Time: 2.02e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 54.7%, Elapsed Time: 2.04e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.1%, Elapsed Time: 2.05e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.4%, Elapsed Time: 2.07e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.8%, Elapsed Time: 2.09e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.1%, Elapsed Time: 2.1e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.5%, Elapsed Time: 2.12e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.8%, Elapsed Time: 2.14e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 57.2%, Elapsed Time: 2.16e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 57.5%, Elapsed Time: 2.17e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 57.9%, Elapsed Time: 2.19e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.2%, Elapsed Time: 2.21e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.6%, Elapsed Time: 2.22e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.9%, Elapsed Time: 2.24e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 59.3%, Elapsed Time: 2.26e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 59.6%, Elapsed Time: 2.28e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.0%, Elapsed Time: 2.3e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.4%, Elapsed Time: 2.31e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.7%, Elapsed Time: 2.33e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 61.1%, Elapsed Time: 2.35e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 61.4%, Elapsed Time: 2.37e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 61.8%, Elapsed Time: 2.38e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.1%, Elapsed Time: 2.4e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.5%, Elapsed Time: 2.42e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.8%, Elapsed Time: 2.44e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.2%, Elapsed Time: 2.46e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.5%, Elapsed Time: 2.47e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.9%, Elapsed Time: 2.49e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 64.2%, Elapsed Time: 2.51e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 64.6%, Elapsed Time: 2.53e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 64.9%, Elapsed Time: 2.55e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 65.3%, Elapsed Time: 2.57e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 65.6%, Elapsed Time: 2.58e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.0%, Elapsed Time: 2.6e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.3%, Elapsed Time: 2.62e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.7%, Elapsed Time: 2.64e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.0%, Elapsed Time: 2.66e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.4%, Elapsed Time: 2.68e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.7%, Elapsed Time: 2.69e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 68.1%, Elapsed Time: 2.71e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 68.4%, Elapsed Time: 2.73e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 68.8%, Elapsed Time: 2.75e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.1%, Elapsed Time: 2.77e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.5%, Elapsed Time: 2.79e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.8%, Elapsed Time: 2.81e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.2%, Elapsed Time: 2.83e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.5%, Elapsed Time: 2.84e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.9%, Elapsed Time: 2.86e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 71.2%, Elapsed Time: 2.88e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 71.6%, Elapsed Time: 2.9e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 71.9%, Elapsed Time: 2.92e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 72.3%, Elapsed Time: 2.94e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 72.6%, Elapsed Time: 2.96e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.0%, Elapsed Time: 2.98e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.3%, Elapsed Time: 3e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.7%, Elapsed Time: 3.02e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.0%, Elapsed Time: 3.04e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.4%, Elapsed Time: 3.06e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.7%, Elapsed Time: 3.08e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 75.1%, Elapsed Time: 3.1e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 75.4%, Elapsed Time: 3.12e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 75.8%, Elapsed Time: 3.13e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.1%, Elapsed Time: 3.15e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.5%, Elapsed Time: 3.17e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.8%, Elapsed Time: 3.19e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.2%, Elapsed Time: 3.21e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.5%, Elapsed Time: 3.23e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.9%, Elapsed Time: 3.25e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 78.2%, Elapsed Time: 3.27e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 78.6%, Elapsed Time: 3.29e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 78.9%, Elapsed Time: 3.31e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 79.3%, Elapsed Time: 3.33e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 79.6%, Elapsed Time: 3.35e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.0%, Elapsed Time: 3.37e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.4%, Elapsed Time: 3.4e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.7%, Elapsed Time: 3.42e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.1%, Elapsed Time: 3.44e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.4%, Elapsed Time: 3.46e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.8%, Elapsed Time: 3.48e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 82.1%, Elapsed Time: 3.5e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 82.5%, Elapsed Time: 3.52e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 82.8%, Elapsed Time: 3.54e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.2%, Elapsed Time: 3.56e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.5%, Elapsed Time: 3.58e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.9%, Elapsed Time: 3.6e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.2%, Elapsed Time: 3.62e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.6%, Elapsed Time: 3.64e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.9%, Elapsed Time: 3.66e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 85.3%, Elapsed Time: 3.68e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 85.6%, Elapsed Time: 3.71e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.0%, Elapsed Time: 3.73e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.3%, Elapsed Time: 3.75e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.7%, Elapsed Time: 3.77e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.0%, Elapsed Time: 3.79e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.4%, Elapsed Time: 3.81e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.7%, Elapsed Time: 3.83e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.1%, Elapsed Time: 3.85e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.4%, Elapsed Time: 3.88e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.8%, Elapsed Time: 3.9e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 89.1%, Elapsed Time: 3.92e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 89.5%, Elapsed Time: 3.94e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 89.8%, Elapsed Time: 3.96e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.2%, Elapsed Time: 3.98e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.5%, Elapsed Time: 4.01e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.9%, Elapsed Time: 4.03e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.2%, Elapsed Time: 4.05e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.6%, Elapsed Time: 4.07e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.9%, Elapsed Time: 4.09e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 92.3%, Elapsed Time: 4.12e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 92.6%, Elapsed Time: 4.14e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.0%, Elapsed Time: 4.16e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.3%, Elapsed Time: 4.18e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.7%, Elapsed Time: 4.2e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.0%, Elapsed Time: 4.23e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.4%, Elapsed Time: 4.25e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.7%, Elapsed Time: 4.27e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.1%, Elapsed Time: 4.29e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.4%, Elapsed Time: 4.32e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.8%, Elapsed Time: 4.34e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 96.1%, Elapsed Time: 4.36e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 96.5%, Elapsed Time: 4.38e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 96.8%, Elapsed Time: 4.41e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.2%, Elapsed Time: 4.43e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.5%, Elapsed Time: 4.45e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.9%, Elapsed Time: 4.47e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.2%, Elapsed Time: 4.5e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.6%, Elapsed Time: 4.52e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.9%, Elapsed Time: 4.54e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 99.3%, Elapsed Time: 4.57e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 99.6%, Elapsed Time: 4.59e+03 s\n", + "Simulation time: 2.9e+02 s, Percentage done: 1e+02%, Elapsed Time: 4.61e+03 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 46%|████▋ | 44954/96874 [00:17<00:20, 2521.42it/s]" + ] + }, + { + "data": { + "image/png": "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j/UTJ05k06ZNdOvWjfDwcC5fvswnn3xCuXLluP/++3PUzsKWH/slrbp16zJw4EA+++wzoqOjad26NTt27GDRokU8/PDDPPDAA/n6HrRaLW+//TZPPvlkunVDhgxh3rx5DBo0iN27dxMREcH333/Pli1bmDlzJn5+foBzmGiLFi0YOXIkp0+fpmbNmixfvjzDHpyPP/6Y+++/n9q1a/PMM89QsWJFoqKi2LZtG+fPn2f//v2ZtrVjx47plrm+YGjdurVHEtO8eXPq169Po0aNCAgIYM+ePcyfP5+wsLB0926bNm0aDz30EB07dqRv3778+++/zJkzh6efftqjd7F37940bdqUJ598kkOHDhEUFMQnn3yC3W73SFY3btzIyy+/TO/evalSpQoWi4XNmzezfPlyGjVqVGxvxi7EXakIKyEKIUSBSVv63eWzzz5TGzZsqHp5eal+fn5q7dq11REjRqgXL150x4SHh6vdunVL91zSlL1W1ZvlwqdNm+Ze5iqffeLECbVjx46qt7e3GhwcrI4bN0612+352iZVVdWff/5ZrVOnjmoymdSIiAh1ypQp6vz589OVbY+MjFS7deum+vn5qYBHGfjdu3erTZo0UQ0Gg1q+fHl1xowZmZZ+z6wdcXFx6qhRo9TKlSurBoNBDQoKUps3b65+8MEHqsViyfA5afXv318F1Pbt26dbt379erVHjx5qaGioajAY1NDQUPWxxx5LV1Y9K3kp/Z629Lqqqmrr1q3VWrVqpVue0f65lf2S2etbrVZ1woQJaoUKFVS9Xq+GhYWpo0aN8iiXnll78vp6lSpVyvAzEBUVpT755JNqUFCQajAY1Nq1a3vsQ5dr166pTzzxhOrv768GBASoTzzxhLp37950+1xVVfXEiRPqgAED1JCQEFWv16v33HOP+uCDD6rff/99jt+LS2al399++221Xr16akBAgKrX69Xy5curzz//vBoZGZnhdn788Ue1Xr16qtFoVMuVK6eOHj06w+N3/fp1dfDgwWqpUqVUb29vtXXr1ule+/jx4+qAAQPUihUrql5eXqrJZFJr1aqljhs3To2Pj8/1exRC3L4UVc3DrG4hhBCZGjRoEN9//72UcBZCCCHucjJnSwghhBBCCCEKgCRbQgghhBBCCFEAJNkSQgghhBBCiAIgc7aEEEIIIYQQogBIz5YQQgghhBBC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GTKEKVOmeMS89dZbdO3alYoVK/L888/TtWtXj+13796drl27UqVKFapWrco777yDr68vf//9d7ZtuBWSbAkhRCFJPVXDLtmWEOIOsGTJEsaOHcs777zD4cOHeffddxkzZgyLFi3yiBs3bhyjR49mz5496HQ6+vXrx4gRI5g1axabN2/m+PHjjB071uM569ev5/Dhw2zcuJFvvvmG5cuXM2HChCzbk5iYyDvvvMOXX37Jli1biI6Opm/fvu71mzdvZsCAAbzyyiscOnSIefPmsXDhQt555x0Adu7cCcCCBQu4dOkSO3fuJCAggHr16rFx40YADhw4gKIo7N271z387s8//6R169aAc8hap06d8PPzY/PmzWzZsgVfX186d+7sTha//fZbxo8fn+1+e/vttxk2bBj79u2jatWqPPbYY1n2SjZv3pxly5Zx/fp1HA4HS5cuJTk5mTZt2gDOQiwGg8GjEIuXlxcAf/31V4bbvHjxIsuXL3e/v8z4+fmxcOFCDh06xKxZs/j888/58MMPPWJOnDjBihUrWLlyJStXruTPP//k/fffd68fPnw4f/75Jz/99BNr165l48aN7NmzJ8vXNZvN6eYeenl5sWPHDneyl1lMZu/ZbrezdOlSEhISaNasWZavf6sk2RJCiEKSes6WlH4XQtwJxo0bx/Tp0+nVqxcVKlSgV69evPbaa8ybN88jbtiwYXTq1IkaNWrwyiuvsHv3bsaMGUOLFi2oX78+gwcPZsOGDR7PMRgMzJ8/n1q1atGtWzcmTpzI7NmzcTgcmbbHarUyZ84cmjVrRsOGDVm0aBFbt25lx44dAEyYMIGRI0cycOBAKlasSIcOHZg0aZK7vaVLlwYgMDCQkJAQ9+M2bdq4k62NGzfSoUMHatSo4b5Y37hxozsZWbZsGQ6Hgy+++ILatWtTo0YNFixYwNmzZ93beP/995k2bVqO9lu3bt2oWrUqEyZM4MyZM+4eqIx8++23WK1WSpUqhdFo5Nlnn+XHH3+kcuXKALRt25bIyEimTZuGxWLhxo0bjBw5EvAcLgrw2GOP4e3tzT333IO/vz9ffPFFpq8LzqF6zZs3JyIigu7duzNs2DC+/fZbjxiHw8HChQu59957admyJU888QTr168HID4+nv/973988MEHtGvXjtq1a7No0aJsh7x26tSJL774gt27d6OqKrt2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yVSqVIkGDRowbNgw9u3bh9VqBWDx4sU8++yz9OnTh4oVK9K3b18GDhzItGnTPPZXz549qVGjBpUqVeKVV16hTp06/PXXX9kfGHFHk2RLCCEKiZR+F+LuFViuHBp/f/D1Tf/zyCOewWXKZBzn6wtdunjGRkRkHJdHTz31FAsWLHA/nj9/Pk8++WSOnjt9+nQaNWrE3r17eeGFF3j++ec5cuRIrtuwZMkSxo4dyzvvvMPhw4d59913GTNmDIsWLfKIGzduHKNHj2bPnj3odDr69evHiBEjmDVrFps3b+b48eOMHTvW4znr16/n8OHDbNy4kW+++Ybly5czYcKETNvSsGFDNBoNCxYswG63ExMTw+LFi2nfvj16vR4As9mMyWTyeJ7JZGLHjh3uhCw1VVVZv349R44coVWrVrneP+LOIsmWEEIUEqlGKIS43T3++OP89ddfnDlzhjNnzrBlyxYef/zxHD23a9euvPDCC1SuXJk333yToKAgNmzYkOs2jBs3junTp9OrVy8qVKhAr169eO2115g3b55H3LBhw+jUqRM1atTglVdeYffu3YwZM4YWLVpQv359Bg8enO71DQYD8+fPp1atWnTr1o2JEycye/ZsHA5Hhm2pUKECa9eu5a233sJoNBIYGMj58+f59ttv3TGdOnXiiy++YPfu3aiqyq5du1i8eDFWq5WrV6+642JiYvD19cVgMNCtWzc++ugjOnTokOv9I+4suqJugBBC3C2kZ0uIu1f0+fP4+/uj0WTwPbdW6/n48uXMN5T2+WkKNdyq0qVL061bNxYuXIiqqnTr1o2goKAcPbdOnTru/7uGBV7O6r1kICEhgRMnTjB48GCeeeYZ93KbzUZAQECmrxccHAxA7dq1PZalff26devi7e3tftysWTPi4+M5d+4c4eHh6doTGRnJM888w8CBA3nssceIi4tj7Nix9O7dm3Xr1qEoCmPGjCEyMpKmTZuiqirBwcH07duX2bNnexxvPz8/9u3bR3x8POvXr+f111+nYsWKtGnTJlf7SNxZJNkSQohCkjq9yuRLVCFEceXj4/zJKNnKKDY3281nTz31FEOHDgWcVfZyyjWszkVRlEx7jDITHx8PwOeff06TJk081mnTJKWpX09RlAyX5fb10/r4448JCAhg6tSp7mVfffUVYWFhbN++naZNm+Ll5cX8+fOZN28e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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:38<00:00, 2511.21it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The average time taken between temperatures 893-993 for all nodes is: 30.459131449098834 seconds.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from gamma_model_simulator import GammaModelSimulator\n", + "import zarr\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\n", + "def run_simulation_and_analyze(INPUT_DATA_DIR, SIM_DIR_NAME, LASER_FILE, ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, collection_rate=0.02, plot_graph=False):\n", + "\n", + " # Create an instance of the simulator\n", + " simulator = GammaModelSimulator(\n", + " input_data_dir=INPUT_DATA_DIR,\n", + " sim_dir_name=SIM_DIR_NAME,\n", + " laser_file=LASER_FILE)\n", + "\n", + " # Set up the simulation\n", + " simulator.setup_simulation()\n", + "\n", + " # Run the simulation\n", + " simulator.run_simulation()\n", + "\n", + " # Open the zarr file\n", + " zarr_array = zarr.open(ZARR_LOCATION, mode='r')\n", + "\n", + " # Convert the zarr array into a pandas DataFrame\n", + " df = pd.DataFrame(zarr_array[:])\n", + "\n", + " return calculate_time(df, min_temp, max_temp, selected_nodes_list, collection_rate, plot_graph)\n", + "\n", + "# Parameters\n", + "INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "SIM_DIR_NAME = \"thin_wall\"\n", + "LASER_FILE = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + "ZARR_LOCATION = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.zarr/ff_dt_temperature\"\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + "# Call function\n", + "avg_time = run_simulation_and_analyze(INPUT_DATA_DIR, SIM_DIR_NAME, LASER_FILE, ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating class to get the heat treatment time" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import zarr\n", + "import pandas as pd\n", + "from tqdm import tqdm\n", + "from gamma_model_simulator import GammaModelSimulator\n", + "\n", + "class TemperatureAnalyzer:\n", + "\n", + " def __init__(self, input_data_dir, sim_dir_name, laser_file):\n", + " self.INPUT_DATA_DIR = input_data_dir\n", + " self.SIM_DIR_NAME = sim_dir_name\n", + " self.LASER_FILE = laser_file\n", + "\n", + " def calculate_time(self, df, min_temp, max_temp, selected_nodes, collection_rate=0.02, plot_graph=False): # Notice 'self' added as the first argument\n", + " total_time_list = []\n", + " \n", + " for column in tqdm(df.columns, desc=\"Processing nodes\"):\n", + " time_axis = np.arange(0, df[column].size * collection_rate, collection_rate)\n", + " \n", + " # Find indices where temperature is within the desired range\n", + " in_range_indices = np.where((df[column] >= min_temp) & (df[column] <= max_temp))[0]\n", + " \n", + " # Check if there are any in-range values\n", + " if len(in_range_indices) == 0:\n", + " total_time_list.append(0)\n", + " continue\n", + "\n", + " # Calculate time between first and last in-range value for this column\n", + " time_diff = (in_range_indices[-1] - in_range_indices[0]) * collection_rate\n", + " total_time_list.append(time_diff)\n", + " \n", + " # If plotting is enabled and this column is one of the selected nodes, then plot\n", + " if plot_graph and str(column) in selected_nodes:\n", + " plt.figure(figsize=(10,5))\n", + " plt.plot(time_axis, df[column], label=f\"Node {column}\")\n", + " if len(in_range_indices) > 0:\n", + " plt.fill_between(time_axis, \n", + " min_temp, \n", + " max_temp, \n", + " where=((df[column] >= min_temp) & (df[column] <= max_temp)),\n", + " color='gray', alpha=0.5, label=f\"Temp between {min_temp} and {max_temp}\")\n", + " \n", + " # Adding horizontal lines for min and max temperature\n", + " plt.axhline(min_temp, color='red', linestyle='--', label=f\"Min Temp {min_temp}\")\n", + " plt.axhline(max_temp, color='blue', linestyle='--', label=f\"Max Temp {max_temp}\")\n", + "\n", + " plt.xlabel(\"Time (seconds)\")\n", + " plt.ylabel(\"Temperature\")\n", + " plt.title(f\"Temperature vs Time for Node {column}\")\n", + " plt.legend()\n", + " plt.grid(True)\n", + "\n", + " # Save the figure to the same directory as the zarr file, with a specific filename for the node\n", + " figure_path = os.path.join(os.path.dirname(zarr_location), f\"Node_{column}_Temperature_vs_Time.png\")\n", + " plt.savefig(figure_path) # Save the figure first\n", + " plt.show() # Then show the figure\n", + " \n", + " return np.mean(total_time_list) \n", + "\n", + " def run_simulation_and_analyze(self, zarr_location, min_temp, max_temp, selected_nodes_list, collection_rate=0.02, plot_graph=False):\n", + " # Create an instance of the simulator\n", + " simulator = GammaModelSimulator(\n", + " input_data_dir=self.INPUT_DATA_DIR,\n", + " sim_dir_name=self.SIM_DIR_NAME,\n", + " laser_file=self.LASER_FILE)\n", + "\n", + " # Set up the simulation\n", + " simulator.setup_simulation()\n", + "\n", + " # Run the simulation\n", + " simulator.run_simulation()\n", + "\n", + " # Open the zarr file\n", + " zarr_array = zarr.open(zarr_location, mode='r')\n", + "\n", + " # Convert the zarr array into a pandas DataFrame\n", + " df = pd.DataFrame(zarr_array[:])\n", + "\n", + " return self.calculate_time(df, min_temp, max_temp, selected_nodes_list, collection_rate, plot_graph)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example usage:\n", + "analyzer = TemperatureAnalyzer(\n", + " \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\",\n", + " \"thin_wall\",\n", + " \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + ")\n", + "\n", + "ZARR_LOCATION = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.zarr/ff_dt_temperature\"\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + "avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# Define the neural network parameters in the following function:\n", + "def objective(params, iteration_number, min_temp=893, max_temp=993):\n", + " # Generate and save the Fourier series\n", + " generator = FourierSeriesGenerator()\n", + " base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + " \n", + " # We use the iteration_number parameter in the plot_and_save method now\n", + " generator.plot_and_save(params, base_path, iteration_number, total_time=30, time_step=0.002)\n", + "\n", + " # Paths for the simulator\n", + " INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + " SIM_DIR_NAME = \"thin_wall\"\n", + " \n", + " # Modify LASER_FILE to reflect the correct iteration and CSV filename\n", + " LASER_FILE = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data\")\n", + "\n", + " # Modify ZARR_LOCATION to reflect the correct iteration\n", + " ZARR_LOCATION = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data.zarr\", \"ff_dt_temperature\")\n", + " \n", + " min_temp, max_temp = 893, 993 # Example thresholds\n", + " selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + " analyzer = TemperatureAnalyzer(\n", + " INPUT_DATA_DIR,\n", + " SIM_DIR_NAME,\n", + " LASER_FILE\n", + " )\n", + "\n", + " # Call function\n", + " avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + " return avg_time # Now returns a 1D tensor\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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dxqGUX7p/VNPPWWEhYUZXl5eRt++fY19+/aZG9okv/deFRQUGP379zfq169veHh4GI0aNTLuu+8+Iy0tzezYprjQ+wQY77//vn2fs2fPGg8++KARHBxs+Pr6Grfccotx4sQJ80Kb5GLvVXJystG7d28jJCTE8PLyMpo1a2ZMmjTJyM7ONje4Ce655x6jUaNGhqenp1G/fn2jb9++xg8//GDfbvZnymIYhnFlqpeIiIiIY9IYIhEREXF5KkQiIiLi8lSIRERExOWpEImIiIjLUyESERERl6dCJCIiIi5PhUhERERcngqRiIiIuDwVIhFxenfddZdLLlciIpWntcxEpFazWCy/u/3pp5/m1VdfRZPyi8jvUSESkVrtxIkT9v/+5JNPmDJlCvv27bPf5+fnh5+fnxnRRKQW0SkzEanVwsPD7bfAwEAsFkuF+/z8/H51yuzaa6/loYceYsKECQQHBxMWFsbs2bPJz8/n7rvvxt/fn2bNmrFw4cIKz7Vz504GDRqEn58fYWFhjB49mlOnTl3hVywiNUGFSERc0pw5c6hXrx4bNmzgoYceYty4cdx66610796dLVu20L9/f0aPHk1BQQEAWVlZ9OnTh44dO7Jp0yYWLVpEeno6w4cPN/mViEh1UCESEZfUvn17nnzySZo3b87kyZPx9vamXr163HfffTRv3pwpU6Zw+vRptm/fDsDrr79Ox44def7554mNjaVjx4689957LF++nP3795v8akTkcmkMkYi4pHbt2tn/283Njbp169K2bVv7fWFhYQBkZGQAsG3bNpYvX37B8UiHDh2iRYsWNZxYRGqSCpGIuCQPD48KP1sslgr3nb96zWazAZCXl8eQIUN44YUXfvVYERERNZhURK4EFSIRkUro1KkTX3zxBY0bN8bdXX91ijgbjSESEamEhIQEMjMzGTlyJBs3buTQoUMsXryYu+++m7KyMrPjichlUiESEamEyMhI1q5dS1lZGf3796dt27ZMmDCBoKAgrFb9VSpS21kMTd8qIiIiLk7/rBERERGXp0IkIiIiLk+FSERERFyeCpGIiIi4PBUiERERcXkqRCIiIuLyVIhERETE5akQiYiIiMtTIRIRERGXp0IkIiIiLk+FSERERFze/wM/6dyFq3ZoCAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.2292811870574951\n", + "Time of calculating critical timestep: 0.915273904800415\n", + "Time of reading and interpolating toolpath: 0.03465008735656738\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 1.4198567867279053\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vnk3019/ded_dt_thermomechanical_solver/src/gamma/interface.py:120: UserWarning: Warning! Time steps of LP input are not well aligned with simulation steps\n", + " warnings.warn(\"Warning! Time steps of LP input are not well aligned with simulation steps\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.08 s\n", + "Simulation time: 2.0 s, Percentage done: 0.702%, Elapsed Time: 18.3 s\n", + "Simulation time: 3.0 s, Percentage done: 1.05%, Elapsed Time: 27.5 s\n", + "Simulation time: 4.0 s, Percentage done: 1.4%, Elapsed Time: 36.8 s\n", + "Simulation time: 5.0 s, Percentage done: 1.75%, Elapsed Time: 46.2 s\n", + "Simulation time: 6.0 s, Percentage done: 2.11%, Elapsed Time: 55.8 s\n", + "Simulation time: 7.0 s, Percentage done: 2.46%, Elapsed Time: 65.3 s\n", + "Simulation time: 8.0 s, Percentage done: 2.81%, Elapsed Time: 75.1 s\n", + "Simulation time: 9.0 s, Percentage done: 3.16%, Elapsed Time: 84.8 s\n", + "Simulation time: 1e+01 s, Percentage done: 3.51%, Elapsed Time: 94.6 s\n", + "Simulation time: 1.1e+01 s, Percentage done: 3.86%, Elapsed Time: 1.04e+02 s\n", + "Simulation time: 1.2e+01 s, Percentage done: 4.21%, Elapsed Time: 1.14e+02 s\n", + "Simulation time: 1.3e+01 s, Percentage done: 4.56%, Elapsed Time: 1.24e+02 s\n", + "Simulation time: 1.4e+01 s, Percentage done: 4.91%, Elapsed Time: 1.34e+02 s\n", + "Simulation time: 1.5e+01 s, Percentage done: 5.26%, Elapsed Time: 1.45e+02 s\n", + "Simulation time: 1.6e+01 s, Percentage done: 5.61%, Elapsed Time: 1.55e+02 s\n", + "Simulation time: 1.7e+01 s, Percentage done: 5.96%, Elapsed Time: 1.65e+02 s\n", + "Simulation time: 1.8e+01 s, Percentage done: 6.32%, Elapsed Time: 1.75e+02 s\n", + "Simulation time: 1.9e+01 s, Percentage done: 6.67%, Elapsed Time: 1.86e+02 s\n", + "Simulation time: 2e+01 s, Percentage done: 7.02%, Elapsed Time: 1.96e+02 s\n", + "Simulation time: 2.1e+01 s, Percentage done: 7.37%, Elapsed Time: 2.06e+02 s\n", + "Simulation time: 2.2e+01 s, Percentage done: 7.72%, Elapsed Time: 2.17e+02 s\n", + "Simulation time: 2.3e+01 s, Percentage done: 8.07%, Elapsed Time: 2.27e+02 s\n", + "Simulation time: 2.4e+01 s, Percentage done: 8.42%, Elapsed Time: 2.38e+02 s\n", + "Simulation time: 2.5e+01 s, Percentage done: 8.77%, Elapsed Time: 2.48e+02 s\n", + "Simulation time: 2.6e+01 s, Percentage done: 9.12%, Elapsed Time: 2.58e+02 s\n", + "Simulation time: 2.7e+01 s, Percentage done: 9.47%, Elapsed Time: 2.69e+02 s\n", + "Simulation time: 2.8e+01 s, Percentage done: 9.82%, Elapsed Time: 2.79e+02 s\n", + "Simulation time: 2.9e+01 s, Percentage done: 10.2%, Elapsed Time: 2.9e+02 s\n", + "Simulation time: 3e+01 s, Percentage done: 10.5%, Elapsed Time: 3e+02 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:35<00:00, 2762.94it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 1: Average Time = 0.5662249932902533\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.3210558891296387\n", + "Time of calculating critical timestep: 0.0780332088470459\n", + "Time of reading and interpolating toolpath: 0.034325361251831055\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.46526169776916504\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vnk3019/ded_dt_thermomechanical_solver/src/gamma/interface.py:120: UserWarning: Warning! Time steps of LP input are not well aligned with simulation steps\n", + " warnings.warn(\"Warning! Time steps of LP input are not well aligned with simulation steps\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 8.99 s\n", + "Simulation time: 2.0 s, Percentage done: 0.702%, Elapsed Time: 18.1 s\n", + "Simulation time: 3.0 s, Percentage done: 1.05%, Elapsed Time: 27.2 s\n", + "Simulation time: 4.0 s, Percentage done: 1.4%, Elapsed Time: 36.5 s\n", + "Simulation time: 5.0 s, Percentage done: 1.75%, Elapsed Time: 45.8 s\n", + "Simulation time: 6.0 s, Percentage done: 2.11%, Elapsed Time: 55.2 s\n", + "Simulation time: 7.0 s, Percentage done: 2.46%, Elapsed Time: 64.6 s\n", + "Simulation time: 8.0 s, Percentage done: 2.81%, Elapsed Time: 74.2 s\n", + "Simulation time: 9.0 s, Percentage done: 3.16%, Elapsed Time: 83.7 s\n", + "Simulation time: 1e+01 s, Percentage done: 3.51%, Elapsed Time: 93.4 s\n", + "Simulation time: 1.1e+01 s, Percentage done: 3.86%, Elapsed Time: 1.03e+02 s\n", + "Simulation time: 1.2e+01 s, Percentage done: 4.21%, Elapsed Time: 1.13e+02 s\n", + "Simulation time: 1.3e+01 s, Percentage done: 4.56%, Elapsed Time: 1.23e+02 s\n", + "Simulation time: 1.4e+01 s, Percentage done: 4.91%, Elapsed Time: 1.32e+02 s\n", + "Simulation time: 1.5e+01 s, Percentage done: 5.26%, Elapsed Time: 1.42e+02 s\n", + "Simulation time: 1.6e+01 s, Percentage done: 5.61%, Elapsed Time: 1.52e+02 s\n", + "Simulation time: 1.7e+01 s, Percentage done: 5.96%, Elapsed Time: 1.62e+02 s\n", + "Simulation time: 1.8e+01 s, Percentage done: 6.32%, Elapsed Time: 1.72e+02 s\n", + "Simulation time: 1.9e+01 s, Percentage done: 6.67%, Elapsed Time: 1.82e+02 s\n", + "Simulation time: 2e+01 s, Percentage done: 7.02%, Elapsed Time: 1.92e+02 s\n", + "Simulation time: 2.1e+01 s, Percentage done: 7.37%, Elapsed Time: 2.02e+02 s\n", + "Simulation time: 2.2e+01 s, Percentage done: 7.72%, Elapsed Time: 2.13e+02 s\n", + "Simulation time: 2.3e+01 s, Percentage done: 8.07%, Elapsed Time: 2.23e+02 s\n", + "Simulation time: 2.4e+01 s, Percentage done: 8.42%, Elapsed Time: 2.33e+02 s\n", + "Simulation time: 2.5e+01 s, Percentage done: 8.77%, Elapsed Time: 2.43e+02 s\n", + "Simulation time: 2.6e+01 s, Percentage done: 9.12%, Elapsed Time: 2.54e+02 s\n", + "Simulation time: 2.7e+01 s, Percentage done: 9.47%, Elapsed Time: 2.64e+02 s\n", + "Simulation time: 2.8e+01 s, Percentage done: 9.82%, Elapsed Time: 2.75e+02 s\n", + "Simulation time: 2.9e+01 s, Percentage done: 10.2%, Elapsed Time: 2.85e+02 s\n", + "Simulation time: 3e+01 s, Percentage done: 10.5%, Elapsed Time: 2.96e+02 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:34<00:00, 2783.52it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 2: Average Time = 0.5448101657823565\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.2271783351898193\n", + "Time of calculating critical timestep: 0.07807612419128418\n", + "Time of reading and interpolating toolpath: 0.034360408782958984\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.46758127212524414\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vnk3019/ded_dt_thermomechanical_solver/src/gamma/interface.py:120: UserWarning: Warning! Time steps of LP input are not well aligned with simulation steps\n", + " warnings.warn(\"Warning! Time steps of LP input are not well aligned with simulation steps\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 8.96 s\n", + "Simulation time: 2.0 s, Percentage done: 0.702%, Elapsed Time: 18.1 s\n", + "Simulation time: 3.0 s, Percentage done: 1.05%, Elapsed Time: 27.4 s\n", + "Simulation time: 4.0 s, Percentage done: 1.4%, Elapsed Time: 36.7 s\n", + "Simulation time: 5.0 s, Percentage done: 1.75%, Elapsed Time: 46.1 s\n", + "Simulation time: 6.0 s, Percentage done: 2.11%, Elapsed Time: 55.5 s\n", + "Simulation time: 7.0 s, Percentage done: 2.46%, Elapsed Time: 64.9 s\n", + "Simulation time: 8.0 s, Percentage done: 2.81%, Elapsed Time: 74.4 s\n", + "Simulation time: 9.0 s, Percentage done: 3.16%, Elapsed Time: 83.9 s\n", + "Simulation time: 1e+01 s, Percentage done: 3.51%, Elapsed Time: 93.5 s\n", + "Simulation time: 1.1e+01 s, Percentage done: 3.86%, Elapsed Time: 1.03e+02 s\n", + "Simulation time: 1.2e+01 s, Percentage done: 4.21%, Elapsed Time: 1.13e+02 s\n", + "Simulation time: 1.3e+01 s, Percentage done: 4.56%, Elapsed Time: 1.23e+02 s\n", + "Simulation time: 1.4e+01 s, Percentage done: 4.91%, Elapsed Time: 1.32e+02 s\n", + "Simulation time: 1.5e+01 s, Percentage done: 5.26%, Elapsed Time: 1.42e+02 s\n", + "Simulation time: 1.6e+01 s, Percentage done: 5.61%, Elapsed Time: 1.52e+02 s\n", + "Simulation time: 1.7e+01 s, Percentage done: 5.96%, Elapsed Time: 1.62e+02 s\n", + "Simulation time: 1.8e+01 s, Percentage done: 6.32%, Elapsed Time: 1.72e+02 s\n", + "Simulation time: 1.9e+01 s, Percentage done: 6.67%, Elapsed Time: 1.82e+02 s\n", + "Simulation time: 2e+01 s, Percentage done: 7.02%, Elapsed Time: 1.92e+02 s\n", + "Simulation time: 2.1e+01 s, Percentage done: 7.37%, Elapsed Time: 2.02e+02 s\n", + "Simulation time: 2.2e+01 s, Percentage done: 7.72%, Elapsed Time: 2.12e+02 s\n", + "Simulation time: 2.3e+01 s, Percentage done: 8.07%, Elapsed Time: 2.23e+02 s\n", + "Simulation time: 2.4e+01 s, Percentage done: 8.42%, Elapsed Time: 2.33e+02 s\n", + "Simulation time: 2.5e+01 s, Percentage done: 8.77%, Elapsed Time: 2.43e+02 s\n", + "Simulation time: 2.6e+01 s, Percentage done: 9.12%, Elapsed Time: 2.53e+02 s\n", + "Simulation time: 2.7e+01 s, Percentage done: 9.47%, Elapsed Time: 2.64e+02 s\n", + "Simulation time: 2.8e+01 s, Percentage done: 9.82%, Elapsed Time: 2.74e+02 s\n", + "Simulation time: 2.9e+01 s, Percentage done: 10.2%, Elapsed Time: 2.85e+02 s\n", + "Simulation time: 3e+01 s, Percentage done: 10.5%, Elapsed Time: 2.95e+02 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:34<00:00, 2799.08it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 3: Average Time = 0.8011685281912587\n", + " Iteration Param1 Param2 Param3 Param4 Param5 Param6 \\\n", + "0 1 0.248921 0.163268 0.127109 0.080705 0.116020 0.799604 \n", + "1 2 0.560183 0.922509 0.610302 0.444303 0.062191 0.646627 \n", + "2 3 0.961140 0.851784 0.116564 0.792890 0.492916 0.804705 \n", + "\n", + " Average_Time \n", + "0 0.566225 \n", + "1 0.544810 \n", + "2 0.801169 \n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Initialize an empty list to store the results\n", + "results = []\n", + "\n", + "# Loop for 3 iterations\n", + "for iteration in range(1, 4): # 1 to 3 inclusive\n", + " params = np.random.rand(6)\n", + " avg_time = objective(params, iteration_number=iteration)\n", + " print(f\"Iteration {iteration}: Average Time = {avg_time}\")\n", + "\n", + " # Append the current iteration's data to the results list\n", + " results.append({\n", + " 'Iteration': iteration,\n", + " 'Param1': params[0],\n", + " 'Param2': params[1],\n", + " 'Param3': params[2],\n", + " 'Param4': params[3],\n", + " 'Param5': params[4],\n", + " 'Param6': params[5],\n", + " 'Average_Time': avg_time\n", + " })\n", + "\n", + "# Convert the results list to a DataFrame\n", + "df = pd.DataFrame(results)\n", + "\n", + "# Optionally, save the DataFrame to a CSV file\n", + "df.to_csv(\"iterations_results.csv\", index=False)\n", + "\n", + "# Print the DataFrame\n", + "print(df)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gamma", + "language": "python", + "name": "gamma" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/avg_heat_treatment_times.xlsx b/avg_heat_treatment_times.xlsx new file mode 100644 index 0000000..9677fcd Binary files /dev/null and b/avg_heat_treatment_times.xlsx differ diff --git a/demo.ipynb b/demo.ipynb new file mode 100644 index 0000000..e1d0e19 --- /dev/null +++ b/demo.ipynb @@ -0,0 +1,2307 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import cupy as cp\n", + "import gamma.interface as rs\n", + "from multiprocessing import Process\n", + "import time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code to Create Laser Power" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Importing necessary modules\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "# Variables to control frequency and total time\n", + "TOTAL_TIME = 400 # in seconds\n", + "Time_Step = 0.002 # default frequency\n", + "\n", + "\n", + "def fourier_series(x, params, rescale_mag=600, rescale_amplitude=50):\n", + " \"\"\"\n", + " Computes the nth partial sum of the Fourier series with the specified frequency, amplitude, and phase.\n", + " Also includes trend and seasonality.\n", + " \"\"\"\n", + "\n", + " # Utility function to normalize a set of values to the range [-1, 1]\n", + " def normalize(x):\n", + " return 2 * (x - np.min(x)) / (np.max(x) - np.min(x)) - 1\n", + "\n", + " # Utility function to rescale a value from [0, 1] to [min_value, max_value]\n", + " def rescale(x, min_value, max_value):\n", + " return x * (max_value - min_value) + min_value\n", + "\n", + " # Normalizing the x values to the range [-1, 1]\n", + " x = normalize(x)\n", + "\n", + " # Extract and scale the parameters for the Fourier series\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(rescale(n, 0, 10))\n", + " freq = rescale(freq, 0, 10)\n", + " amplitude = rescale(amplitude, 0, 10)\n", + " phase = rescale(phase, 0, 10000)\n", + " trend = rescale(trend, -500, 500)\n", + " seasonality = rescale(seasonality, 0, 200)\n", + "\n", + " # Compute the Fourier series using the scaled parameters\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + "\n", + " # Check if the computed Fourier series is a zero vector. If yes, return a vector of constant values\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + 600\n", + " else:\n", + " # Scale the computed Fourier series to the range [0, 1]\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + rescale_mag\n", + "\n", + " # Add a linear trend to the computed Fourier series\n", + " y += trend * x\n", + "\n", + " # Add a seasonal pattern to the computed Fourier series\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + "\n", + " return y\n", + "\n", + "# Generate x values between 0 and 1000 in 1000 evenly spaced steps\n", + "x = np.linspace(0, TOTAL_TIME, int(TOTAL_TIME / 0.002))\n", + "\n", + "# Generate random parameters for the Fourier series\n", + "params = np.random.rand(6)\n", + "\n", + "# Compute the Fourier series for the generated x values and random parameters\n", + "y = fourier_series(x, params)\n", + "\n", + "# Plot the computed Fourier series\n", + "plt.plot(x, y, label=f'Curve')\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"Laser Power\")\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "# Generate a CSV string of the computed Fourier series and the corresponding x values\n", + "output_string = \"laser_power,time_elapsed\\n\"\n", + "for i in range(len(x)):\n", + " output_string += f\"{y[i]:.15f},{x[i]:.3f}\\n\" # Changed the format for x[i] to 3 decimal places\n", + "\n", + "# Save the generated CSV string to a file\n", + "with open(\"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.csv\", \"w\") as f:\n", + " f.write(output_string)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Class of generating laser power " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import os\n", + "\n", + "class FourierSeriesGenerator:\n", + "\n", + " def __init__(self, total_time=400, time_step=0.002):\n", + " self.default_total_time = total_time\n", + " self.default_time_step = time_step\n", + "\n", + " @staticmethod\n", + " def _normalize(x):\n", + " return 2 * (x - np.min(x)) / (np.max(x) - np.min(x)) - 1\n", + "\n", + " @staticmethod\n", + " def _rescale(x, min_value, max_value):\n", + " return x * (max_value - min_value) + min_value\n", + "\n", + " def fourier_series(self, x, params, rescale_mag=600, rescale_amplitude=50):\n", + " x = self._normalize(x)\n", + "\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(self._rescale(n, 0, 10))\n", + " freq = self._rescale(freq, 0, 10)\n", + " amplitude = self._rescale(amplitude, 0, 10)\n", + " phase = self._rescale(phase, 0, 10000)\n", + " trend = self._rescale(trend, -500, 500)\n", + " seasonality = self._rescale(seasonality, 0, 200)\n", + "\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + 600\n", + " else:\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + rescale_mag\n", + "\n", + " y += trend * x\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + " return y\n", + "\n", + " def plot_and_save(self, params, base_path, iteration, total_time=None, time_step=None):\n", + " if total_time is None:\n", + " total_time = self.default_total_time\n", + " if time_step is None:\n", + " time_step = self.default_time_step\n", + "\n", + " folder_name = f\"Iteration_{iteration}\"\n", + " save_directory = os.path.join(base_path, folder_name)\n", + " if not os.path.exists(save_directory):\n", + " os.makedirs(save_directory) # Create directory if it doesn't exist\n", + "\n", + " x = np.linspace(0, total_time, int(total_time / time_step))\n", + " y = self.fourier_series(x, params)\n", + "\n", + " plt.plot(x, y, label=f'Curve')\n", + " plt.xlabel(\"Time\")\n", + " plt.ylabel(\"Laser Power\")\n", + " plt.legend()\n", + " image_path = os.path.join(save_directory, \"plot.png\")\n", + " plt.savefig(image_path)\n", + " plt.show()\n", + "\n", + " output_string = \"laser_power,time_elapsed\\n\"\n", + " for i in range(len(x)):\n", + " output_string += f\"{y[i]:.15f},{x[i]:.2f}\\n\"\n", + " csv_path = os.path.join(save_directory, \"data.csv\")\n", + " with open(csv_path, \"w\") as f:\n", + " f.write(output_string)\n", + "\n", + "# Example usage:\n", + "generator = FourierSeriesGenerator()\n", + "params = np.random.rand(6)\n", + "base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + "iteration_number = 2\n", + "generator.plot_and_save(params, base_path, iteration_number, total_time=300, time_step=0.02)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inverse Fourier" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df = pd.read_excel(\"/home/vnk3019/ded_dt_thermomechanical_solver/laser_power_data.xlsx\")" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "221.3147238441714\n", + "14252\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NLP_40NLP_41NLP_42NLP_43NLP_44NLP_45NLP_46NLP_47NLP_48NLP_49...NLP_66NLP_67NLP_68NLP_69NLP_70NLP_71NLP_72NLP_73NLP_74NLP_75
00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000...0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
1220.728290167.977663242.368830230.234362240.886751185.125818184.513099275.153225246.425114155.349305...230.352555232.472651220.365257227.661635190.560527199.833645232.938574213.184892248.890935218.492025
2220.745465168.180033242.447622230.353234241.026704185.509980184.623857275.416915246.557702155.594555...230.396375232.563982220.416689227.770793190.670711199.880134233.080166213.151755249.364597218.510910
3220.764398168.414755242.541018230.517267241.192463185.972276184.751815275.745666246.815352155.904072...230.447799232.680792220.476873227.927316190.862263199.932664233.239027213.160670250.050111218.530564
4220.783170168.660104242.642394230.719508241.369204186.475265184.886415276.118055247.199443156.259309...230.502125232.816692220.540351228.127711191.147880199.986100233.400091213.240229250.923453218.548851
..................................................................
14247221.314817167.895906240.763392232.040287240.127764160.537583185.146201276.361040251.202072154.596974...231.650645235.813765220.492796227.876692183.276251203.237958238.971496205.775109257.314329208.107136
14248221.314770167.899174240.767867232.062763240.124490160.593146185.148416276.371897251.271507154.604187...231.650647235.817312220.491778227.873576183.288338203.237777238.970709205.796192257.428922208.106932
14249221.314743167.901947240.771692232.080974240.122927160.633039185.149806276.378296251.325651154.611269...231.650775235.820833220.491211227.872774183.306489203.237665238.970133205.818753257.501548208.106812
14250221.314729167.903716240.774166232.092565240.122132160.655997185.150304276.379810251.359340154.615171...231.650897235.823102220.490931227.871664183.318594203.237601238.969647205.833424257.532889208.106752
14251221.314724167.904366240.775061232.097174240.121654160.664285185.150147276.378008251.372658154.615690...231.650951235.823767220.490808227.869623183.321024203.237569238.969255205.836692257.533978208.106729
\n", + "

14252 rows × 36 columns

\n", + "
" + ], + "text/plain": [ + " NLP_40 NLP_41 NLP_42 NLP_43 NLP_44 NLP_45 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "1 220.728290 167.977663 242.368830 230.234362 240.886751 185.125818 \n", + "2 220.745465 168.180033 242.447622 230.353234 241.026704 185.509980 \n", + "3 220.764398 168.414755 242.541018 230.517267 241.192463 185.972276 \n", + "4 220.783170 168.660104 242.642394 230.719508 241.369204 186.475265 \n", + "... ... ... ... ... ... ... \n", + "14247 221.314817 167.895906 240.763392 232.040287 240.127764 160.537583 \n", + "14248 221.314770 167.899174 240.767867 232.062763 240.124490 160.593146 \n", + "14249 221.314743 167.901947 240.771692 232.080974 240.122927 160.633039 \n", + "14250 221.314729 167.903716 240.774166 232.092565 240.122132 160.655997 \n", + "14251 221.314724 167.904366 240.775061 232.097174 240.121654 160.664285 \n", + "\n", + " NLP_46 NLP_47 NLP_48 NLP_49 ... NLP_66 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 ... 0.000000 \n", + "1 184.513099 275.153225 246.425114 155.349305 ... 230.352555 \n", + "2 184.623857 275.416915 246.557702 155.594555 ... 230.396375 \n", + "3 184.751815 275.745666 246.815352 155.904072 ... 230.447799 \n", + "4 184.886415 276.118055 247.199443 156.259309 ... 230.502125 \n", + "... ... ... ... ... ... ... \n", + "14247 185.146201 276.361040 251.202072 154.596974 ... 231.650645 \n", + "14248 185.148416 276.371897 251.271507 154.604187 ... 231.650647 \n", + "14249 185.149806 276.378296 251.325651 154.611269 ... 231.650775 \n", + "14250 185.150304 276.379810 251.359340 154.615171 ... 231.650897 \n", + "14251 185.150147 276.378008 251.372658 154.615690 ... 231.650951 \n", + "\n", + " NLP_67 NLP_68 NLP_69 NLP_70 NLP_71 NLP_72 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "1 232.472651 220.365257 227.661635 190.560527 199.833645 232.938574 \n", + "2 232.563982 220.416689 227.770793 190.670711 199.880134 233.080166 \n", + "3 232.680792 220.476873 227.927316 190.862263 199.932664 233.239027 \n", + "4 232.816692 220.540351 228.127711 191.147880 199.986100 233.400091 \n", + "... ... ... ... ... ... ... \n", + "14247 235.813765 220.492796 227.876692 183.276251 203.237958 238.971496 \n", + "14248 235.817312 220.491778 227.873576 183.288338 203.237777 238.970709 \n", + "14249 235.820833 220.491211 227.872774 183.306489 203.237665 238.970133 \n", + "14250 235.823102 220.490931 227.871664 183.318594 203.237601 238.969647 \n", + "14251 235.823767 220.490808 227.869623 183.321024 203.237569 238.969255 \n", + "\n", + " NLP_73 NLP_74 NLP_75 \n", + "0 0.000000 0.000000 0.000000 \n", + "1 213.184892 248.890935 218.492025 \n", + "2 213.151755 249.364597 218.510910 \n", + "3 213.160670 250.050111 218.530564 \n", + "4 213.240229 250.923453 218.548851 \n", + "... ... ... ... \n", + "14247 205.775109 257.314329 208.107136 \n", + "14248 205.796192 257.428922 208.106932 \n", + "14249 205.818753 257.501548 208.106812 \n", + "14250 205.833424 257.532889 208.106752 \n", + "14251 205.836692 257.533978 208.106729 \n", + "\n", + "[14252 rows x 36 columns]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"NLP_40\"]\n", + "last_element = df[\"NLP_40\"].iloc[-1]\n", + "print(last_element)\n", + "num_rows = len(df)\n", + "print(num_rows)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimizing for NLP_40\n", + "Optimized parameters for NLP_40: [5.00000000e+00 9.96864946e-01 3.97671723e+00 1.57878121e-04\n", + " 4.99239013e-01 8.69946792e-10]\n", + "Optimizing for NLP_41\n", + "Optimized parameters for NLP_41: [5.00000000e+00 9.94178414e-01 3.59726646e+00 1.48533741e-04\n", + " 4.98927830e-01 6.19220174e-04]\n", + "Optimizing for NLP_42\n", + "Optimized parameters for NLP_42: [5.00000000e+00 9.97275796e-01 3.73026010e+00 1.58241450e-04\n", + " 5.00045807e-01 1.56991791e-25]\n", + "Optimizing for NLP_43\n", + "Optimized parameters for NLP_43: [5.00000000e+00 9.98035841e-01 6.26337560e+00 1.59717262e-04\n", + " 4.99445252e-01 3.31339961e-18]\n", + "Optimizing for NLP_44\n", + "Optimized parameters for NLP_44: [5.00000000e+00 9.97351466e-01 6.28426057e+00 1.60099401e-04\n", + " 4.99873083e-01 7.35362302e-04]\n", + "Optimizing for NLP_45\n", + "Optimized parameters for NLP_45: [5.00000000e+00 1.01000574e+00 3.74868491e+00 1.57075053e-04\n", + " 4.99065051e-01 2.56413940e-03]\n", + "Optimizing for NLP_46\n", + "Optimized parameters for NLP_46: [5.00000000e+00 1.00050582e+00 6.01694891e+00 1.53240726e-04\n", + " 4.99559203e-01 1.97381211e-16]\n", + "Optimizing for NLP_47\n", + "Optimized parameters for NLP_47: [5.00000000e+00 9.96030714e-01 8.57957086e+00 1.39920250e-04\n", + " 5.00345890e-01 3.77629937e-14]\n", + "Optimizing for NLP_48\n", + "Optimized parameters for NLP_48: [5.00000000e+00 9.98666892e-01 3.59849421e+00 1.57070843e-04\n", + " 5.00087997e-01 9.92533792e-15]\n", + "Optimizing for NLP_49\n", + "Optimized parameters for NLP_49: [5.00000000e+00 9.96281058e-01 3.71874883e+00 1.56261544e-04\n", + " 4.99681153e-01 6.27751979e-04]\n", + "Optimizing for NLP_50\n", + "Optimized parameters for NLP_50: [5.00000000e+00 9.98784679e-01 4.05176892e+00 1.49836009e-04\n", + " 5.00285910e-01 1.16222830e-10]\n", + "Optimizing for NLP_51\n", + "Optimized parameters for NLP_51: [5.00000000e+00 9.92057962e-01 6.01539133e+00 1.68080681e-04\n", + " 4.99213774e-01 1.44066922e-22]\n", + "Optimizing for NLP_52\n", + "Optimized parameters for NLP_52: [5.00000000e+00 9.98033939e-01 6.15625369e+00 1.62006826e-04\n", + " 4.99896125e-01 8.85355232e-19]\n", + "Optimizing for NLP_53\n", + "Optimized parameters for NLP_53: [5.00000000e+00 9.97842137e-01 6.12009642e+00 1.60024794e-04\n", + " 4.99752079e-01 9.25783129e-04]\n", + "Optimizing for NLP_54\n", + "Optimized parameters for NLP_54: [5.00000000e+00 9.96806940e-01 7.04064245e+00 1.57056986e-04\n", + " 4.99741584e-01 1.71725116e-03]\n", + "Optimizing for NLP_55\n", + "Optimized parameters for NLP_55: [5.00000000e+00 9.98018023e-01 3.22495390e+00 1.61157832e-04\n", + " 4.99404466e-01 8.95063336e-04]\n", + "Optimizing for NLP_56\n", + "Optimized parameters for NLP_56: [5.00000000e+00 1.00112399e+00 6.04596482e+00 1.46488737e-04\n", + " 4.98760070e-01 2.37033383e-16]\n", + "Optimizing for NLP_57\n", + "Optimized parameters for NLP_57: [5.00000000e+00 9.96839399e-01 5.50373380e+00 1.57063174e-04\n", + " 4.99020094e-01 6.13618330e-26]\n", + "Optimizing for NLP_58\n", + "Optimized parameters for NLP_58: [5.00000000e+00 9.98868212e-01 5.53664037e+00 1.56993298e-04\n", + " 4.99574632e-01 1.15989676e-13]\n", + "Optimizing for NLP_59\n", + "Optimized parameters for NLP_59: [5.00000000e+00 9.97901717e-01 6.36652990e+00 1.54553984e-04\n", + " 4.99723580e-01 1.38078590e-18]\n", + "Optimizing for NLP_60\n", + "Optimized parameters for NLP_60: [5.00000000e+00 9.96815318e-01 6.06307808e+00 1.58535721e-04\n", + " 4.99867298e-01 7.59808923e-15]\n", + "Optimizing for NLP_61\n", + "Optimized parameters for NLP_61: [5.00000000e+00 9.98042234e-01 9.10293073e+00 1.61177077e-04\n", + " 4.99538548e-01 1.08178077e-05]\n", + "Optimizing for NLP_62\n", + "Optimized parameters for NLP_62: [5.00000000e+00 9.97794529e-01 4.58577396e+00 1.54535221e-04\n", + " 4.99893483e-01 4.91866957e-04]\n", + "Optimizing for NLP_63\n", + "Optimized parameters for NLP_63: [5.00000000e+00 9.96573423e-01 5.72431939e+00 1.50474599e-04\n", + " 4.99280315e-01 2.49012729e-20]\n", + "Optimizing for NLP_64\n", + "Optimized parameters for NLP_64: [5.00000000e+00 9.99386770e-01 6.27648857e+00 1.68216971e-04\n", + " 4.97854329e-01 5.00439894e-11]\n", + "Optimizing for NLP_65\n", + "Optimized parameters for NLP_65: [5.00000000e+00 9.99116564e-01 9.95000000e+00 1.48117839e-04\n", + " 4.98709768e-01 4.61592228e-11]\n", + "Optimizing for NLP_66\n", + "Optimized parameters for NLP_66: [5.00000000e+00 9.98023938e-01 3.98272223e+00 1.61176793e-04\n", + " 4.99752628e-01 7.61653402e-04]\n", + "Optimizing for NLP_67\n", + "Optimized parameters for NLP_67: [5.00000000e+00 9.98078469e-01 6.06555060e+00 1.54520781e-04\n", + " 4.99575810e-01 1.51150688e-18]\n", + "Optimizing for NLP_68\n", + "Optimized parameters for NLP_68: [5.00000000e+00 9.98075375e-01 3.88562915e+00 1.57916213e-04\n", + " 4.99810991e-01 2.15728730e-03]\n", + "Optimizing for NLP_69\n", + "Optimized parameters for NLP_69: [5.00000000e+00 9.97889218e-01 3.90278035e+00 1.59266743e-04\n", + " 4.99872004e-01 3.75574175e-04]\n", + "Optimizing for NLP_70\n", + "Optimized parameters for NLP_70: [5.00000000e+00 1.00426898e+00 6.00320617e+00 1.64419395e-04\n", + " 4.98545348e-01 1.83520803e-03]\n", + "Optimizing for NLP_71\n", + "Optimized parameters for NLP_71: [5.00000000e+00 9.99582576e-01 3.87698935e+00 1.54417661e-04\n", + " 4.99956643e-01 4.88302291e-11]\n", + "Optimizing for NLP_72\n", + "Optimized parameters for NLP_72: [5.00000000e+00 9.96634135e-01 6.00647746e+00 1.54798050e-04\n", + " 5.00319730e-01 1.56177313e-25]\n", + "Optimizing for NLP_73\n", + "Optimized parameters for NLP_73: [5.00000000e+00 1.00373772e+00 2.92849989e+00 1.57149193e-04\n", + " 4.98528094e-01 1.82999515e-05]\n", + "Optimizing for NLP_74\n", + "Optimized parameters for NLP_74: [5.00000000e+00 9.99787272e-01 3.99874811e+00 4.81263129e-04\n", + " 4.99352452e-01 1.97893237e-11]\n", + "Optimizing for NLP_75\n", + "Optimized parameters for NLP_75: [5.00000000e+00 9.97456586e-01 6.28416820e+00 1.55550771e-04\n", + " 4.99061000e-01 2.76838637e-03]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from scipy.optimize import least_squares\n", + "import matplotlib.pyplot as plt\n", + "\n", + "class FourierSeriesGeneratorInverse(FourierSeriesGenerator):\n", + "\n", + " def fourier_series(self, x, params, rescale_amplitude=50, mean_value=None):\n", + " x = self._normalize(x)\n", + "\n", + " n, freq, amplitude, phase, trend, seasonality, = params\n", + " n = int(self._rescale(n, 0, 10))\n", + " freq = self._rescale(freq, 0, 10)\n", + " amplitude = self._rescale(amplitude, 0, 10)\n", + " phase = self._rescale(phase, 0, 10000)\n", + " trend = self._rescale(trend, -500, 500)\n", + " seasonality = self._rescale(seasonality, 0, 200)\n", + "\n", + " sum = np.zeros_like(x)\n", + " for i in range(1, n + 1, 2):\n", + " term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase)\n", + " sum += term\n", + "\n", + " y = amplitude * (2 / np.pi) * sum\n", + " if np.sum(y) == 0:\n", + " return np.zeros_like(x) + mean_value # defaulting to mean_value\n", + " else:\n", + " y = (y - np.min(y)) / (np.max(y) - np.min(y))\n", + " y = (y * rescale_amplitude) + mean_value\n", + "\n", + " y += trend * x\n", + " y += seasonality * np.sin(2 * np.pi * x)\n", + " return y\n", + "\n", + " def objective_function(self, params, x, target_output):\n", + " y = self.fourier_series(x, params, mean_value=np.mean(target_output))\n", + " return y - target_output\n", + "\n", + " def find_parameters(self, x, target_output, initial_guess):\n", + " # Set the bounds for each of the parameters\n", + " lower_bounds = [0, 0, 0, 0, -1, 0]\n", + " upper_bounds = [10, 10, 10, 10000, 1, 200]\n", + " \n", + " result = least_squares(self.objective_function, initial_guess, args=(x, target_output), bounds=(lower_bounds, upper_bounds))\n", + " return result.x\n", + "\n", + "params_dict = {}\n", + "\n", + "columns_to_optimize = [\"NLP_40\", \"NLP_41\", \"NLP_42\", \"NLP_43\", \"NLP_44\", \"NLP_45\", \n", + " \"NLP_46\", \"NLP_47\", \"NLP_48\", \"NLP_49\", \"NLP_50\", \"NLP_51\", \n", + " \"NLP_52\", \"NLP_53\", \"NLP_54\", \"NLP_55\", \"NLP_56\", \"NLP_57\", \n", + " \"NLP_58\", \"NLP_59\", \"NLP_60\", \"NLP_61\", \"NLP_62\", \"NLP_63\", \n", + " \"NLP_64\", \"NLP_65\", \"NLP_66\", \"NLP_67\", \"NLP_68\", \"NLP_69\", \n", + " \"NLP_70\", \"NLP_71\", \"NLP_72\", \"NLP_73\", \"NLP_74\", \"NLP_75\"]\n", + "\n", + "for col in columns_to_optimize:\n", + " print(f\"Optimizing for {col}\")\n", + " \n", + " last_element = df[col].iloc[-1]\n", + " num_rows = len(df)\n", + " x = np.linspace(0, int(last_element), num_rows)\n", + " given_laser_power = df[col]\n", + " \n", + " # Adjust initial guess to be within bounds\n", + " initial_guess = [5, 1, 0.5, 0, 0, 0]\n", + " \n", + " # Find the parameters\n", + " optimized_params = generator.find_parameters(x, given_laser_power, initial_guess)\n", + " \n", + " # Store the optimized parameters\n", + " params_dict[col] = optimized_params\n", + " print(f\"Optimized parameters for {col}: {optimized_params}\")\n", + "\n", + "# Convert the parameters dictionary to a DataFrame and save it as an Excel file\n", + "params_df = pd.DataFrame.from_dict(params_dict, orient='index', columns=['n', 'freq', 'amplitude', 'phase', 'trend', 'seasonality'])\n", + "params_df.to_excel(\"optimized_params.xlsx\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data and Laser Power Location" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "input_data_dir = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "sim_dir_name = \"thin_wall\"\n", + "laser_file = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP_2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initiate the FEAModel" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.3773400783538818\n", + "Time of calculating critical timestep: 0.8901991844177246\n", + "Time of reading and interpolating toolpath: 0.03641104698181152\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 1.3159127235412598\n" + ] + } + ], + "source": [ + "sim_itr = rs.FeaModel(\n", + " input_data_dir= input_data_dir,\n", + " geom_dir=sim_dir_name,\n", + " laserpowerfile=laser_file, ## Laser input is given here\n", + " VtkOutputStep = 1.,\n", + " ZarrOutputStep = 0.02,\n", + " outputVtkFiles=True,\n", + " verbose=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.1674394607543945\n", + "Time of calculating critical timestep: 0.07886791229248047\n", + "Time of reading and interpolating toolpath: 0.03437995910644531\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.4650602340698242\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.06 s\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[66], line 18\u001b[0m\n\u001b[1;32m 15\u001b[0m simulator\u001b[39m.\u001b[39msetup_simulation()\n\u001b[1;32m 17\u001b[0m \u001b[39m# Run the simulation\u001b[39;00m\n\u001b[0;32m---> 18\u001b[0m simulator\u001b[39m.\u001b[39;49mrun_simulation()\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/gamma_model_simulator.py:34\u001b[0m, in \u001b[0;36mGammaModelSimulator.run_simulation\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrun_simulation\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 33\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39msim_itr:\n\u001b[0;32m---> 34\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49msim_itr\u001b[39m.\u001b[39;49mrun()\n\u001b[1;32m 35\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 36\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mSimulation is not setup yet. Call setup_simulation() first.\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/interface.py:123\u001b[0m, in \u001b[0;36mFeaModel.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 120\u001b[0m warnings\u001b[39m.\u001b[39mwarn(\u001b[39m\"\u001b[39m\u001b[39mWarning! Time steps of LP input are not well aligned with simulation steps\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 122\u001b[0m \u001b[39m# Run the solver\u001b[39;00m\n\u001b[0;32m--> 123\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mheat_solver\u001b[39m.\u001b[39;49mtime_integration()\n\u001b[1;32m 125\u001b[0m \u001b[39m# Save timestamped zarr file\u001b[39;00m\n\u001b[1;32m 126\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\u001b[39m.\u001b[39mcurrent_sim_time \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mZarrOutputTimes[\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mZarrFileNum] \u001b[39m-\u001b[39m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\u001b[39m.\u001b[39mdt\u001b[39m/\u001b[39m\u001b[39m10\u001b[39m)):\n\u001b[1;32m 127\u001b[0m \n\u001b[1;32m 128\u001b[0m \u001b[39m# Free unused memory blocks\u001b[39;00m\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/simulator/gamma.py:735\u001b[0m, in \u001b[0;36mheat_solve_mgr.time_integration\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 733\u001b[0m domain \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdomain\n\u001b[1;32m 734\u001b[0m domain\u001b[39m.\u001b[39mupdate_birth()\n\u001b[0;32m--> 735\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mupdate_cp_cond()\n\u001b[1;32m 736\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mupdate_mvec_stifness()\n\u001b[1;32m 738\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlaser_loc \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mtoolpath[\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcurrent_step,\u001b[39m0\u001b[39m:\u001b[39m3\u001b[39m]\n", + "File \u001b[0;32m~/ded_dt_thermomechanical_solver/src/gamma/simulator/gamma.py:646\u001b[0m, in \u001b[0;36mheat_solve_mgr.update_cp_cond\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 644\u001b[0m matID \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m0\u001b[39m]\n\u001b[1;32m 645\u001b[0m mat \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39melement_mat \u001b[39m==\u001b[39m matID\n\u001b[0;32m--> 646\u001b[0m thetaIp \u001b[39m=\u001b[39m temperature_ip[domain\u001b[39m.\u001b[39;49mactive_elements\u001b[39m*\u001b[39;49mmat]\n\u001b[1;32m 648\u001b[0m solidus \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m2\u001b[39m]\n\u001b[1;32m 649\u001b[0m liquidus \u001b[39m=\u001b[39m domain\u001b[39m.\u001b[39mmat_thermal[i][\u001b[39m3\u001b[39m]\n", + "File \u001b[0;32mcupy/_core/core.pyx:1526\u001b[0m, in \u001b[0;36mcupy._core.core._ndarray_base.__getitem__\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:42\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._ndarray_getitem\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:770\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._getitem_mask_single\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_indexing.pyx:754\u001b[0m, in \u001b[0;36mcupy._core._routines_indexing._prepare_mask_indexing_single\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mcupy/_core/_routines_manipulation.pyx:479\u001b[0m, in \u001b[0;36mcupy._core._routines_manipulation.broadcast_to\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32m~/miniconda3/envs/gamma/lib/python3.10/site-packages/numpy/lib/function_base.py:385\u001b[0m, in \u001b[0;36miterable\u001b[0;34m(y)\u001b[0m\n\u001b[1;32m 348\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 349\u001b[0m \u001b[39mCheck whether or not an object can be iterated over.\u001b[39;00m\n\u001b[1;32m 350\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 382\u001b[0m \n\u001b[1;32m 383\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 384\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 385\u001b[0m \u001b[39miter\u001b[39;49m(y)\n\u001b[1;32m 386\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mTypeError\u001b[39;00m:\n\u001b[1;32m 387\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mFalse\u001b[39;00m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from gamma_model_simulator import GammaModelSimulator\n", + "\n", + "# Define your parameters\n", + "INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "SIM_DIR_NAME = \"thin_wall\"\n", + "LASER_FILE = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + "\n", + "# Create an instance of the simulator\n", + "simulator = GammaModelSimulator(\n", + " input_data_dir=INPUT_DATA_DIR,\n", + " sim_dir_name=SIM_DIR_NAME,\n", + " laser_file=LASER_FILE)\n", + "\n", + "# Set up the simulation\n", + "simulator.setup_simulation()\n", + "\n", + "# Run the simulation\n", + "simulator.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open the Output File" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type : zarr.core.Array\n", + "Data type : float64\n", + "Shape : (14252, 96874)\n", + "Chunk shape : (1, 96874)\n", + "Order : C\n", + "Read-only : True\n", + "Compressor : None\n", + "Store type : zarr.storage.DirectoryStore\n", + "No. bytes : 11045185984 (10.3G)\n", + "No. bytes stored : 11044411221 (10.3G)\n", + "Storage ratio : 1.0\n", + "Chunks initialized : 14251/14252\n", + "\n", + " 0 1 2 3 4 5 6 7 8 9 ... \\\n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... \n", + "1 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "2 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "3 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "4 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 ... \n", + "\n", + " 96864 96865 96866 96867 96868 96869 96870 96871 96872 96873 \n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "2 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "3 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "4 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 300.0 \n", + "\n", + "[5 rows x 96874 columns]\n" + ] + } + ], + "source": [ + "import zarr\n", + "import pandas as pd\n", + "\n", + "\n", + "# Path to the zarr file\n", + "zarr_location = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP_2.zarr/ff_dt_temperature\"\n", + "\n", + "# Open the zarr file\n", + "zarr_array = zarr.open(zarr_location, mode='r')\n", + "\n", + "# Now, you can access the contents of the zarr file through zarr_array like a numpy array.\n", + "print(zarr_array.info)\n", + "\n", + "# Convert the zarr array into a pandas DataFrame\n", + "df = pd.DataFrame(zarr_array[:])\n", + "\n", + "print(df.head()) # Display the first few rows of the DataFrame\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code to calculate the heat treatment time" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 46%|████▌ | 44734/96874 [00:16<00:19, 2678.65it/s]" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAHWCAYAAACBjZMqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAADBH0lEQVR4nOzdd3gUZdfA4d/29ISQkBAIJPQioUuT3oNI8wMEpYiCvaJY6NgAQUAsKC+IvPgCKiIqUkQRBKQ3Aek9hJrets33x2Y32WRTSYFw7uvKBTtzZvbZmZ3ZOfOUUSmKoiCEEEIIIYQQokipS7sAQgghhBBCCFEWSbIlhBBCCCGEEMVAki0hhBBCCCGEKAaSbAkhhBBCCCFEMZBkSwghhBBCCCGKgSRbQgghhBBCCFEMJNkSQgghhBBCiGIgyZYQQgghhBBCFANJtoQQQgghhBCiGEiyJYQQQgDnzp1DpVLx1VdflXZRnMycOZNq1aqh0Who1KhRaRenSN2p21wIIYqKJFtCiDJBpVLl62/z5s2lXdRS8+mnn95zF7WTJ0/O1/eiQ4cOpV1UlzZs2MDrr79OmzZtWLx4Me+9916xvt+IESNQqVRERESgKEq2+SqViueee65Yy1CUTp8+jZubGyqVij179jjN++qrr3L8PkRHR2db15o1a2jSpAlubm5UqVKFSZMmYTabs8XFxsYyevRoAgMD8fT0pGPHjuzbty9b3Msvv0yTJk3w9/fHw8ODunXrMnnyZBITE4tuAwghSp22tAsghBBFYenSpU6vv/76azZu3Jhtet26dUuyWHeUTz/9lICAAEaMGFHaRSkx/fv3p0aNGo7XiYmJPP300/Tr14/+/fs7pgcFBVG1alVSUlLQ6XSlUVSXfv/9d9RqNf/5z3/Q6/Ul9r6HDx9m1apVDBgwoMTeszi8/PLLaLVa0tLScoyZOnUq4eHhTtP8/PycXv/666/07duXDh068PHHH3P48GHeeecdrl27xmeffeaIs1qt9OrVi4MHD/Laa68REBDAp59+SocOHdi7dy81a9Z0xO7evZu2bdsycuRI3Nzc2L9/Px988AG//fYbW7ZsQa2W++FClAWSbAkhyoRHH33U6fXff//Nxo0bs00vKxRFITU1FXd3dylHLiIiIoiIiHC8vnHjBk8//TQREREuvxtubm4lWbw8Xbt2DXd39yJLtPKzv9zd3QkNDWXq1Kn0798flUpVJO9d0tavX8/69et5/fXXeeedd3KM69mzJ82aNct1XWPHjiUiIoINGzag1dounXx8fHjvvfd48cUXqVOnDgDfffcd27dv59tvv+Xhhx8GYODAgdSqVYtJkybxzTffONb5119/ZXuf6tWrM3bsWHbt2kXLli0L/JmFEHceuW0ihLhnWK1W5syZQ/369XFzcyMoKIgxY8YQExPjFBcWFsaDDz7I5s2badasGe7u7jRo0MDRBHHVqlU0aNAANzc3mjZtyv79+52WHzFiBF5eXpw5c4bu3bvj6elJSEgIU6dOzdY0q6BlWr9+vaNMCxYsAGDx4sV06tSJChUqYDAYqFevntPddvvyR44c4c8//8zWdM7e1C4rezOrc+fO5ascsbGxvPTSS4SGhmIwGKhRowbTp0/HarXmul8efPBBqlWr5nJeq1atnC6EN27cyAMPPICfnx9eXl7Url2bt956K9f155er/kP2fXnhwgUefPBBvLy8qFSpEp988glgqwHq1KkTnp6eVK1a1eli2q6w20WlUrF48WKSkpIc+8xeNrPZzLRp06hevToGg4GwsDDeeuutbDU4ue2vnKjVasaPH8+hQ4f44Ycf8txu165dY9SoUQQFBeHm5kbDhg1ZsmSJy+0wYsQIfH198fPzY/jw4cTGxrpc57///svDDz+Mv78/bm5uNGvWjDVr1uRZFjuTycSLL77Iiy++SPXq1fOMT0hIwGKxuJx39OhRjh49yujRox2JFsAzzzyDoih89913jmnfffcdQUFBTrWmgYGBDBw4kB9//DHXGjaw7S8gx+0ihLj7SLIlhLhnjBkzhtdee402bdowd+5cRo4cybJly+jevTsmk8kp9tSpUwwZMoTevXvz/vvvExMTQ+/evVm2bBkvv/wyjz76KFOmTOH06dMMHDgw24WzxWKhR48eBAUFMWPGDJo2bcqkSZOYNGlSoct0/PhxHnnkEbp27crcuXMdgyV89tlnVK1albfeeotZs2YRGhrKM88840gIAObMmUPlypWpU6cOS5cuZenSpbz99tuF2o6uypGcnEz79u3573//y7Bhw5g3bx5t2rThzTff5JVXXsl1fYMGDeLs2bPs3r3bafr58+f5+++/GTx4MABHjhzhwQcfJC0tjalTpzJr1iweeughtm3bVqjPkV8Wi4WePXsSGhrKjBkzCAsL47nnnuOrr76iR48eNGvWjOnTp+Pt7c2wYcM4e/asY9nb2S5Lly6lbdu2GAwGxz5r164dAE888QQTJ06kSZMmfPTRR7Rv357333/fsa0yy+l7k5shQ4ZQs2ZNlzcIMktJSaFDhw4sXbqUoUOHMnPmTHx9fRkxYgRz5851xCmKQp8+fVi6dCmPPvoo77zzDpcuXWL48OHZ1nnkyBFatmzJsWPHeOONN5g1axaenp707ds3X8kf2L7vMTExjB8/Ps/Yjh074uPjg4eHBw899BAnT550mm+/mZK19iskJITKlSs73WzZv38/TZo0ydYE8P777yc5OZkTJ044TTebzdy4cYOoqCg2bNjA+PHj8fb25v7778/X5xRC3AUUIYQog5599lkl8ylu69atCqAsW7bMKW7dunXZpletWlUBlO3btzumrV+/XgEUd3d35fz5847pCxYsUADljz/+cEwbPny4AijPP/+8Y5rValV69eql6PV65fr164Uu07p167J91uTk5GzTunfvrlSrVs1pWv369ZX27dtni500aZLi6udg8eLFCqCcPXs2z3JMmzZN8fT0VE6cOOE0/Y033lA0Go1y4cKFbOu3i4uLUwwGg/Lqq686TZ8xY4aiUqkc2/ujjz5SAMf2K4zr168rgDJp0qRs886ePasAyuLFix3T7Pvyvffec0yLiYlR3N3dFZVKpSxfvtwx/d9//8227tvZLvb39/T0dJp24MABBVCeeOIJp+ljx45VAOX33393TMvte5PX+y1ZskQBlFWrVjnmA8qzzz7reD1nzhwFUP773/86phmNRqVVq1aKl5eXEh8fryiKoqxevVoBlBkzZjjizGaz0rZt22zbvHPnzkqDBg2U1NRUxzSr1aq0bt1aqVmzZp6f4cqVK4q3t7eyYMECRVEyvse7d+92iluxYoUyYsQIZcmSJcoPP/ygjB8/XvHw8FACAgKc9svMmTMVwOW+at68udKyZUvHa09PT+Xxxx/PFvfLL7+43A87duxQAMdf7dq1nc4lQoi7n9RsCSHuCd9++y2+vr507dqVGzduOP6aNm2Kl5cXf/zxh1N8vXr1aNWqleN1ixYtAOjUqRNVqlTJNv3MmTPZ3jPzqG32UdyMRiO//fZbocoUHh5O9+7ds71P5v43cXFx3Lhxg/bt23PmzBni4uLy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tIsiilCHDh1o1KgRc+bMKe2iFAtpRiiEECVE7VSzJc0IhbhXmEwmUlJS0Gq1uLu7F/ufVqslOTkZk8mUr/KpVKpc/yZPnly8G6iEqVQqVq9eXdrFKJTo6Ggee+wxgoOD8fT0pEmTJnz//fdOMfv27aNr1674+flRvnx5Ro8eTWJiomP+zZs36dGjByEhIRgMBkJDQ3nuueeIj48v6Y+Tb5988gl169bF3d2d2rVr8/XXXzvNN5lMTJ06lerVq+Pm5kbDhg1Zt26dU8xnn31GREQEPj4++Pj40KpVK3799ddiL7vUbAkhRAnJfD9bki0h7j06nQ6DwVAi72U2m/Mde+XKFcf/V6xYwcSJEzl+/LhjmpeXV5GWTRTesGHDiI2NZc2aNQQEBPDNN98wcOBA9uzZQ+PGjYmKiqJLly4MGjSI+fPnEx8fz0svvcSIESP47rvvAFCr1fTp04d33nmHwMBATp06xbPPPsutW7f45ptvSvkTZvfZZ5/x5ptv8uWXX9K8eXN27drFk08+Sbly5ejduzcA48eP57///S9ffvklderUYf369fTr14/t27fTuHFjACpXrswHH3xAzZo1URSFJUuW0KdPH/bv30/9+vWLrfxSsyWEECUkazNCIYS4EwQHBzv+fH19UalUTtOWL19O3bp1cXNzo06dOnz66aeOZc+dO4dKpWLlypW0bdsWd3d3mjdvzokTJ9i9ezfNmjXDy8uLnj17cv36dcdyI0aMoG/fvkyZMoXAwEB8fHx46qmnMBqNeZZ39erV1KxZEzc3N7p3787Fixed5v/44480adIENzc3qlWrxpQpUxzJZ1hYGAD9+vVDpVIRFhZGXFwcGo2GPXv2AGC1WvH396dly5aOdf73v/8lNDTU8frixYsMHDgQPz8//P396dOnD+fOnXMqx8KFC/PcbqtWraJjx454eHjQsGFDduzYketn3759O88//zz3338/1apVY/z48fj5+bF3714Afv75Z3Q6HZ988gm1a9emefPmfP7553z//fecOnUKgHLlyvH000/TrFkzqlatSufOnXnmmWfYunVrru89btw4atWqhYeHB9WqVWPChAlOtaeTJ0+mUaNGLF26lLCwMHx9fRk8eDAJCQmOmKSkJIYNG4aXlxcVK1Zk1qxZub4nwNKlSxkzZgyDBg2iWrVqDB48mNGjRzN9+nSn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4MBljz8qKsrhWA8cOKDExESH8UlJSQ7309PT9ctf/lLJycl65plnavw/8PPzsx8bAMAcNMgAADQ4PyxWLBaLw7aqAqmqffm5c+c0cuRI/e53v6v2XFXFyg+FhYWpqKhIJSUl8vX1lSQFBQVp586dWrdunVatWqWZM2dq9uzZ2rZtm86dOydJev/999WyZUuH57LZbJIqC5j6cKVjrY3Zs2fr7rvv1vvvv68PPvhAs2bN0ptvvqnbb7/dPubUqVNq0aJFvcQLAKgZM1sAALfXq1cv7du3T23atNE111zjcAsICKjxMT169JAk7d+/32G7t7e3kpOTNX/+fGVnZ+vIkSNau3at4uPjZbPZlJeXV+01YmJiJFXOSH3yyScqLS2t9nrBwcGKjo7Wxo0bHbZv3LhR8fHxtT7Wzp07a8uWLQ7bNm/eXG1chw4dNHXqVK1atUqjRo3SwoUL7fsuXryo3Nxc9ezZs9avCwCoO4otAIDbS01N1alTpzR27Fht27ZNubm5+vDDD3XvvfeqvLy8xse0aNFCvXr10oYNG+zbli9frueff167d+/W0aNH9dprr6miokIdO3ZUUFCQHnvsMU2dOlWvvvqqcnNztXPnTr3wwgt69dVXJUlpaWkqLCzUXXfdpe3bt+vgwYN6/fXX7e3up02bpt/97ndatmyZcnJy9Pjjj2v37t16+OGHa32sDz30kFauXKk//OEPOnjwoP7v//7PoaPhhQsXlJaWpnXr1uno0aPauHGjtm3bps6dO9vHbN68WTabrdryQwBA/aLYAgC4vaoZo/LycqWkpCghIUGPPPKIQkND5eV1+R91v/zlLx0u7hsaGqq3335bgwcPVufOnfXSSy9p6dKl6tKliyRp3rx5euqpp5SRkaHOnTtr2LBhev/99xUXFydJat68udauXatz587phhtuUO/evfXyyy/blwU+9NBDSk9P16OPPqqEhAStXLlS//nPf9S+fftaH2u/fv308ssv67nnnlP37t21atUqPfnkk/b9VqtVJ0+e1D333KMOHTrozjvv1PDhwzVnzhz7mKVLl2rcuHHy9/ev9esCAOrOYhiG4eogAABwhQsXLqhjx45atmyZx8zynDhxQh07dtT27dvtRSIAwBzMbAEAPJafn59ee+21K178uLE5cuSIXnzxRQotAHACZrYAAAAAwATMbAEAAACACSi2AAAAAMAEFFsAAAAAYAKKLQAAAAAwAcUWAAAAAJiAYgsAAAAATECxBQAAAAAmoNgCAAAAABNQbAEAAACACf4/PH59L9YZty4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:35<00:00, 2721.67it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The average time taken between temperatures 893-993 for all nodes is: 30.059493775419615 seconds.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\n", + "def calculate_time(df, min_temp, max_temp, selected_nodes, collection_rate=0.02, plot_graph=False):\n", + " total_time_list = []\n", + " \n", + " for column in tqdm(df.columns, desc=\"Processing nodes\"):\n", + " time_axis = np.arange(0, df[column].size * collection_rate, collection_rate)\n", + " \n", + " # Find indices where temperature is within the desired range\n", + " in_range_indices = np.where((df[column] >= min_temp) & (df[column] <= max_temp))[0]\n", + " \n", + " # Check if there are any in-range values\n", + " if len(in_range_indices) == 0:\n", + " total_time_list.append(0)\n", + " continue\n", + "\n", + " # Calculate time between first and last in-range value for this column\n", + " time_diff = (in_range_indices[-1] - in_range_indices[0]) * collection_rate\n", + " total_time_list.append(time_diff)\n", + " \n", + " # If plotting is enabled and this column is one of the selected nodes, then plot\n", + " if plot_graph and str(column) in selected_nodes:\n", + " plt.figure(figsize=(10,5))\n", + " plt.plot(time_axis, df[column], label=f\"Node {column}\")\n", + " if len(in_range_indices) > 0:\n", + " plt.fill_between(time_axis, \n", + " min_temp, \n", + " max_temp, \n", + " where=((df[column] >= min_temp) & (df[column] <= max_temp)),\n", + " color='gray', alpha=0.5, label=f\"Temp between {min_temp} and {max_temp}\")\n", + " \n", + " # Adding horizontal lines for min and max temperature\n", + " plt.axhline(min_temp, color='red', linestyle='--', label=f\"Min Temp {min_temp}\")\n", + " plt.axhline(max_temp, color='blue', linestyle='--', label=f\"Max Temp {max_temp}\")\n", + "\n", + " plt.xlabel(\"Time (seconds)\")\n", + " plt.ylabel(\"Temperature\")\n", + " plt.title(f\"Temperature vs Time for Node {column}\")\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()\n", + " \n", + " return np.mean(total_time_list)\n", + "\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "avg_time = calculate_time(df, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Objective Function" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.5523247718811035\n", + "Time of calculating critical timestep: 0.07913565635681152\n", + "Time of reading and interpolating toolpath: 0.036163330078125\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.46532511711120605\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.04 s\n", + "Simulation time: 2.0 s, Percentage done: 0.702%, Elapsed Time: 18.2 s\n", + "Simulation time: 3.0 s, Percentage done: 1.05%, Elapsed Time: 27.3 s\n", + "Simulation time: 4.0 s, Percentage done: 1.4%, Elapsed Time: 36.6 s\n", + "Simulation time: 5.0 s, Percentage done: 1.75%, Elapsed Time: 45.9 s\n", + "Simulation time: 6.0 s, Percentage done: 2.11%, Elapsed Time: 55.3 s\n", + "Simulation time: 7.0 s, Percentage done: 2.46%, Elapsed Time: 64.8 s\n", + "Simulation time: 8.0 s, Percentage done: 2.81%, Elapsed Time: 74.3 s\n", + "Simulation time: 9.0 s, Percentage done: 3.16%, Elapsed Time: 83.9 s\n", + "Simulation time: 1e+01 s, Percentage done: 3.51%, Elapsed Time: 93.5 s\n", + "Simulation time: 1.1e+01 s, Percentage done: 3.86%, Elapsed Time: 1.03e+02 s\n", + "Simulation time: 1.2e+01 s, Percentage done: 4.21%, Elapsed Time: 1.13e+02 s\n", + "Simulation time: 1.3e+01 s, Percentage done: 4.56%, Elapsed Time: 1.23e+02 s\n", + "Simulation time: 1.4e+01 s, Percentage done: 4.91%, Elapsed Time: 1.33e+02 s\n", + "Simulation time: 1.5e+01 s, Percentage done: 5.26%, Elapsed Time: 1.43e+02 s\n", + "Simulation time: 1.6e+01 s, Percentage done: 5.61%, Elapsed Time: 1.52e+02 s\n", + "Simulation time: 1.7e+01 s, Percentage done: 5.96%, Elapsed Time: 1.62e+02 s\n", + "Simulation time: 1.8e+01 s, Percentage done: 6.32%, Elapsed Time: 1.73e+02 s\n", + "Simulation time: 1.9e+01 s, Percentage done: 6.67%, Elapsed Time: 1.83e+02 s\n", + "Simulation time: 2e+01 s, Percentage done: 7.02%, Elapsed Time: 1.93e+02 s\n", + "Simulation time: 2.1e+01 s, Percentage done: 7.37%, Elapsed Time: 2.03e+02 s\n", + "Simulation time: 2.2e+01 s, Percentage done: 7.72%, Elapsed Time: 2.13e+02 s\n", + "Simulation time: 2.3e+01 s, Percentage done: 8.07%, Elapsed Time: 2.24e+02 s\n", + "Simulation time: 2.4e+01 s, Percentage done: 8.42%, Elapsed Time: 2.34e+02 s\n", + "Simulation time: 2.5e+01 s, Percentage done: 8.77%, Elapsed Time: 2.44e+02 s\n", + "Simulation time: 2.6e+01 s, Percentage done: 9.12%, Elapsed Time: 2.55e+02 s\n", + "Simulation time: 2.7e+01 s, Percentage done: 9.47%, Elapsed Time: 2.65e+02 s\n", + "Simulation time: 2.8e+01 s, Percentage done: 9.82%, Elapsed Time: 2.76e+02 s\n", + "Simulation time: 2.9e+01 s, Percentage done: 10.2%, Elapsed Time: 2.86e+02 s\n", + "Simulation time: 3e+01 s, Percentage done: 10.5%, Elapsed Time: 2.97e+02 s\n", + "Simulation time: 3.1e+01 s, Percentage done: 10.9%, Elapsed Time: 3.08e+02 s\n", + "Simulation time: 3.2e+01 s, Percentage done: 11.2%, Elapsed Time: 3.19e+02 s\n", + "Simulation time: 3.3e+01 s, Percentage done: 11.6%, Elapsed Time: 3.29e+02 s\n", + "Simulation time: 3.4e+01 s, Percentage done: 11.9%, Elapsed Time: 3.41e+02 s\n", + "Simulation time: 3.5e+01 s, Percentage done: 12.3%, Elapsed Time: 3.52e+02 s\n", + "Simulation time: 3.6e+01 s, Percentage done: 12.6%, Elapsed Time: 3.63e+02 s\n", + "Simulation time: 3.7e+01 s, Percentage done: 13.0%, Elapsed Time: 3.74e+02 s\n", + "Simulation time: 3.8e+01 s, Percentage done: 13.3%, Elapsed Time: 3.85e+02 s\n", + "Simulation time: 3.9e+01 s, Percentage done: 13.7%, Elapsed Time: 3.96e+02 s\n", + "Simulation time: 4e+01 s, Percentage done: 14.0%, Elapsed Time: 4.07e+02 s\n", + "Simulation time: 4.1e+01 s, Percentage done: 14.4%, Elapsed Time: 4.18e+02 s\n", + "Simulation time: 4.2e+01 s, Percentage done: 14.7%, Elapsed Time: 4.29e+02 s\n", + "Simulation time: 4.3e+01 s, Percentage done: 15.1%, Elapsed Time: 4.41e+02 s\n", + "Simulation time: 4.4e+01 s, Percentage done: 15.4%, Elapsed Time: 4.52e+02 s\n", + "Simulation time: 4.5e+01 s, Percentage done: 15.8%, Elapsed Time: 4.64e+02 s\n", + "Simulation time: 4.6e+01 s, Percentage done: 16.1%, Elapsed Time: 4.75e+02 s\n", + "Simulation time: 4.7e+01 s, Percentage done: 16.5%, Elapsed Time: 4.87e+02 s\n", + "Simulation time: 4.8e+01 s, Percentage done: 16.8%, Elapsed Time: 4.98e+02 s\n", + "Simulation time: 4.9e+01 s, Percentage done: 17.2%, Elapsed Time: 5.1e+02 s\n", + "Simulation time: 5e+01 s, Percentage done: 17.5%, Elapsed Time: 5.21e+02 s\n", + "Simulation time: 5.1e+01 s, Percentage done: 17.9%, Elapsed Time: 5.33e+02 s\n", + "Simulation time: 5.2e+01 s, Percentage done: 18.2%, Elapsed Time: 5.45e+02 s\n", + "Simulation time: 5.3e+01 s, Percentage done: 18.6%, Elapsed Time: 5.57e+02 s\n", + "Simulation time: 5.4e+01 s, Percentage done: 18.9%, Elapsed Time: 5.69e+02 s\n", + "Simulation time: 5.5e+01 s, Percentage done: 19.3%, Elapsed Time: 5.8e+02 s\n", + "Simulation time: 5.6e+01 s, Percentage done: 19.6%, Elapsed Time: 5.92e+02 s\n", + "Simulation time: 5.7e+01 s, Percentage done: 20.0%, Elapsed Time: 6.04e+02 s\n", + "Simulation time: 5.8e+01 s, Percentage done: 20.4%, Elapsed Time: 6.16e+02 s\n", + "Simulation time: 5.9e+01 s, Percentage done: 20.7%, Elapsed Time: 6.29e+02 s\n", + "Simulation time: 6e+01 s, Percentage done: 21.1%, Elapsed Time: 6.41e+02 s\n", + "Simulation time: 6.1e+01 s, Percentage done: 21.4%, Elapsed Time: 6.53e+02 s\n", + "Simulation time: 6.2e+01 s, Percentage done: 21.8%, Elapsed Time: 6.66e+02 s\n", + "Simulation time: 6.3e+01 s, Percentage done: 22.1%, Elapsed Time: 6.78e+02 s\n", + "Simulation time: 6.4e+01 s, Percentage done: 22.5%, Elapsed Time: 6.9e+02 s\n", + "Simulation time: 6.5e+01 s, Percentage done: 22.8%, Elapsed Time: 7.03e+02 s\n", + "Simulation time: 6.6e+01 s, Percentage done: 23.2%, Elapsed Time: 7.15e+02 s\n", + "Simulation time: 6.7e+01 s, Percentage done: 23.5%, Elapsed Time: 7.27e+02 s\n", + "Simulation time: 6.8e+01 s, Percentage done: 23.9%, Elapsed Time: 7.4e+02 s\n", + "Simulation time: 6.9e+01 s, Percentage done: 24.2%, Elapsed Time: 7.52e+02 s\n", + "Simulation time: 7e+01 s, Percentage done: 24.6%, Elapsed Time: 7.65e+02 s\n", + "Simulation time: 7.1e+01 s, Percentage done: 24.9%, Elapsed Time: 7.78e+02 s\n", + "Simulation time: 7.2e+01 s, Percentage done: 25.3%, Elapsed Time: 7.9e+02 s\n", + "Simulation time: 7.3e+01 s, Percentage done: 25.6%, Elapsed Time: 8.03e+02 s\n", + "Simulation time: 7.4e+01 s, Percentage done: 26.0%, Elapsed Time: 8.16e+02 s\n", + "Simulation time: 7.5e+01 s, Percentage done: 26.3%, Elapsed Time: 8.29e+02 s\n", + "Simulation time: 7.6e+01 s, Percentage done: 26.7%, Elapsed Time: 8.41e+02 s\n", + "Simulation time: 7.7e+01 s, Percentage done: 27.0%, Elapsed Time: 8.54e+02 s\n", + "Simulation time: 7.8e+01 s, Percentage done: 27.4%, Elapsed Time: 8.67e+02 s\n", + "Simulation time: 7.9e+01 s, Percentage done: 27.7%, Elapsed Time: 8.8e+02 s\n", + "Simulation time: 8e+01 s, Percentage done: 28.1%, Elapsed Time: 8.94e+02 s\n", + "Simulation time: 8.1e+01 s, Percentage done: 28.4%, Elapsed Time: 9.07e+02 s\n", + "Simulation time: 8.2e+01 s, Percentage done: 28.8%, Elapsed Time: 9.2e+02 s\n", + "Simulation time: 8.3e+01 s, Percentage done: 29.1%, Elapsed Time: 9.33e+02 s\n", + "Simulation time: 8.4e+01 s, Percentage done: 29.5%, Elapsed Time: 9.47e+02 s\n", + "Simulation time: 8.5e+01 s, Percentage done: 29.8%, Elapsed Time: 9.6e+02 s\n", + "Simulation time: 8.6e+01 s, Percentage done: 30.2%, Elapsed Time: 9.73e+02 s\n", + "Simulation time: 8.7e+01 s, Percentage done: 30.5%, Elapsed Time: 9.87e+02 s\n", + "Simulation time: 8.8e+01 s, Percentage done: 30.9%, Elapsed Time: 1e+03 s\n", + "Simulation time: 8.9e+01 s, Percentage done: 31.2%, Elapsed Time: 1.01e+03 s\n", + "Simulation time: 9e+01 s, Percentage done: 31.6%, Elapsed Time: 1.03e+03 s\n", + "Simulation time: 9.1e+01 s, Percentage done: 31.9%, Elapsed Time: 1.04e+03 s\n", + "Simulation time: 9.2e+01 s, Percentage done: 32.3%, Elapsed Time: 1.05e+03 s\n", + "Simulation time: 9.3e+01 s, Percentage done: 32.6%, Elapsed Time: 1.07e+03 s\n", + "Simulation time: 9.4e+01 s, Percentage done: 33.0%, Elapsed Time: 1.08e+03 s\n", + "Simulation time: 9.5e+01 s, Percentage done: 33.3%, Elapsed Time: 1.1e+03 s\n", + "Simulation time: 9.6e+01 s, Percentage done: 33.7%, Elapsed Time: 1.11e+03 s\n", + "Simulation time: 9.7e+01 s, Percentage done: 34.0%, Elapsed Time: 1.12e+03 s\n", + "Simulation time: 9.8e+01 s, Percentage done: 34.4%, Elapsed Time: 1.14e+03 s\n", + "Simulation time: 9.9e+01 s, Percentage done: 34.7%, Elapsed Time: 1.15e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 35.1%, Elapsed Time: 1.17e+03 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vnk3019/ded_dt_thermomechanical_solver/src/gamma/interface.py:120: UserWarning: Warning! Time steps of LP input are not well aligned with simulation steps\n", + " warnings.warn(\"Warning! Time steps of LP input are not well aligned with simulation steps\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation time: 1e+02 s, Percentage done: 35.4%, Elapsed Time: 1.18e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 35.8%, Elapsed Time: 1.19e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.1%, Elapsed Time: 1.21e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.5%, Elapsed Time: 1.22e+03 s\n", + "Simulation time: 1e+02 s, Percentage done: 36.8%, Elapsed Time: 1.24e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.2%, Elapsed Time: 1.25e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.5%, Elapsed Time: 1.27e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 37.9%, Elapsed Time: 1.28e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.2%, Elapsed Time: 1.3e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.6%, Elapsed Time: 1.31e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 38.9%, Elapsed Time: 1.32e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 39.3%, Elapsed Time: 1.34e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 39.6%, Elapsed Time: 1.35e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 40.0%, Elapsed Time: 1.37e+03 s\n", + "Simulation time: 1.1e+02 s, Percentage done: 40.4%, Elapsed Time: 1.38e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 40.7%, Elapsed Time: 1.4e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.1%, Elapsed Time: 1.41e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.4%, Elapsed Time: 1.43e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 41.8%, Elapsed Time: 1.44e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.1%, Elapsed Time: 1.46e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.5%, Elapsed Time: 1.47e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 42.8%, Elapsed Time: 1.49e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.2%, Elapsed Time: 1.5e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.5%, Elapsed Time: 1.52e+03 s\n", + "Simulation time: 1.2e+02 s, Percentage done: 43.9%, Elapsed Time: 1.53e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.2%, Elapsed Time: 1.55e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.6%, Elapsed Time: 1.57e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 44.9%, Elapsed Time: 1.58e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 45.3%, Elapsed Time: 1.6e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 45.6%, Elapsed Time: 1.61e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.0%, Elapsed Time: 1.63e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.3%, Elapsed Time: 1.64e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 46.7%, Elapsed Time: 1.66e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 47.0%, Elapsed Time: 1.68e+03 s\n", + "Simulation time: 1.3e+02 s, Percentage done: 47.4%, Elapsed Time: 1.69e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 47.7%, Elapsed Time: 1.71e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.1%, Elapsed Time: 1.72e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.4%, Elapsed Time: 1.74e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 48.8%, Elapsed Time: 1.76e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.1%, Elapsed Time: 1.77e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.5%, Elapsed Time: 1.79e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 49.8%, Elapsed Time: 1.8e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.2%, Elapsed Time: 1.82e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.5%, Elapsed Time: 1.84e+03 s\n", + "Simulation time: 1.4e+02 s, Percentage done: 50.9%, Elapsed Time: 1.85e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.2%, Elapsed Time: 1.87e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.6%, Elapsed Time: 1.89e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 51.9%, Elapsed Time: 1.9e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 52.3%, Elapsed Time: 1.92e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 52.6%, Elapsed Time: 1.93e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.0%, Elapsed Time: 1.95e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.3%, Elapsed Time: 1.97e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 53.7%, Elapsed Time: 1.99e+03 s\n", + "Simulation time: 1.5e+02 s, Percentage done: 54.0%, Elapsed Time: 2e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 54.4%, Elapsed Time: 2.02e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 54.7%, Elapsed Time: 2.04e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.1%, Elapsed Time: 2.05e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.4%, Elapsed Time: 2.07e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 55.8%, Elapsed Time: 2.09e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.1%, Elapsed Time: 2.1e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.5%, Elapsed Time: 2.12e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 56.8%, Elapsed Time: 2.14e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 57.2%, Elapsed Time: 2.16e+03 s\n", + "Simulation time: 1.6e+02 s, Percentage done: 57.5%, Elapsed Time: 2.17e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 57.9%, Elapsed Time: 2.19e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.2%, Elapsed Time: 2.21e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.6%, Elapsed Time: 2.22e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 58.9%, Elapsed Time: 2.24e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 59.3%, Elapsed Time: 2.26e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 59.6%, Elapsed Time: 2.28e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.0%, Elapsed Time: 2.3e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.4%, Elapsed Time: 2.31e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 60.7%, Elapsed Time: 2.33e+03 s\n", + "Simulation time: 1.7e+02 s, Percentage done: 61.1%, Elapsed Time: 2.35e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 61.4%, Elapsed Time: 2.37e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 61.8%, Elapsed Time: 2.38e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.1%, Elapsed Time: 2.4e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.5%, Elapsed Time: 2.42e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 62.8%, Elapsed Time: 2.44e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.2%, Elapsed Time: 2.46e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.5%, Elapsed Time: 2.47e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 63.9%, Elapsed Time: 2.49e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 64.2%, Elapsed Time: 2.51e+03 s\n", + "Simulation time: 1.8e+02 s, Percentage done: 64.6%, Elapsed Time: 2.53e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 64.9%, Elapsed Time: 2.55e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 65.3%, Elapsed Time: 2.57e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 65.6%, Elapsed Time: 2.58e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.0%, Elapsed Time: 2.6e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.3%, Elapsed Time: 2.62e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 66.7%, Elapsed Time: 2.64e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.0%, Elapsed Time: 2.66e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.4%, Elapsed Time: 2.68e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 67.7%, Elapsed Time: 2.69e+03 s\n", + "Simulation time: 1.9e+02 s, Percentage done: 68.1%, Elapsed Time: 2.71e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 68.4%, Elapsed Time: 2.73e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 68.8%, Elapsed Time: 2.75e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.1%, Elapsed Time: 2.77e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.5%, Elapsed Time: 2.79e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 69.8%, Elapsed Time: 2.81e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.2%, Elapsed Time: 2.83e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.5%, Elapsed Time: 2.84e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 70.9%, Elapsed Time: 2.86e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 71.2%, Elapsed Time: 2.88e+03 s\n", + "Simulation time: 2e+02 s, Percentage done: 71.6%, Elapsed Time: 2.9e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 71.9%, Elapsed Time: 2.92e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 72.3%, Elapsed Time: 2.94e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 72.6%, Elapsed Time: 2.96e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.0%, Elapsed Time: 2.98e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.3%, Elapsed Time: 3e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 73.7%, Elapsed Time: 3.02e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.0%, Elapsed Time: 3.04e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.4%, Elapsed Time: 3.06e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 74.7%, Elapsed Time: 3.08e+03 s\n", + "Simulation time: 2.1e+02 s, Percentage done: 75.1%, Elapsed Time: 3.1e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 75.4%, Elapsed Time: 3.12e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 75.8%, Elapsed Time: 3.13e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.1%, Elapsed Time: 3.15e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.5%, Elapsed Time: 3.17e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 76.8%, Elapsed Time: 3.19e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.2%, Elapsed Time: 3.21e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.5%, Elapsed Time: 3.23e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 77.9%, Elapsed Time: 3.25e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 78.2%, Elapsed Time: 3.27e+03 s\n", + "Simulation time: 2.2e+02 s, Percentage done: 78.6%, Elapsed Time: 3.29e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 78.9%, Elapsed Time: 3.31e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 79.3%, Elapsed Time: 3.33e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 79.6%, Elapsed Time: 3.35e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.0%, Elapsed Time: 3.37e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.4%, Elapsed Time: 3.4e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 80.7%, Elapsed Time: 3.42e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.1%, Elapsed Time: 3.44e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.4%, Elapsed Time: 3.46e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 81.8%, Elapsed Time: 3.48e+03 s\n", + "Simulation time: 2.3e+02 s, Percentage done: 82.1%, Elapsed Time: 3.5e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 82.5%, Elapsed Time: 3.52e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 82.8%, Elapsed Time: 3.54e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.2%, Elapsed Time: 3.56e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.5%, Elapsed Time: 3.58e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 83.9%, Elapsed Time: 3.6e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.2%, Elapsed Time: 3.62e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.6%, Elapsed Time: 3.64e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 84.9%, Elapsed Time: 3.66e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 85.3%, Elapsed Time: 3.68e+03 s\n", + "Simulation time: 2.4e+02 s, Percentage done: 85.6%, Elapsed Time: 3.71e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.0%, Elapsed Time: 3.73e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.3%, Elapsed Time: 3.75e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 86.7%, Elapsed Time: 3.77e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.0%, Elapsed Time: 3.79e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.4%, Elapsed Time: 3.81e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 87.7%, Elapsed Time: 3.83e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.1%, Elapsed Time: 3.85e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.4%, Elapsed Time: 3.88e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 88.8%, Elapsed Time: 3.9e+03 s\n", + "Simulation time: 2.5e+02 s, Percentage done: 89.1%, Elapsed Time: 3.92e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 89.5%, Elapsed Time: 3.94e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 89.8%, Elapsed Time: 3.96e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.2%, Elapsed Time: 3.98e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.5%, Elapsed Time: 4.01e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 90.9%, Elapsed Time: 4.03e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.2%, Elapsed Time: 4.05e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.6%, Elapsed Time: 4.07e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 91.9%, Elapsed Time: 4.09e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 92.3%, Elapsed Time: 4.12e+03 s\n", + "Simulation time: 2.6e+02 s, Percentage done: 92.6%, Elapsed Time: 4.14e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.0%, Elapsed Time: 4.16e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.3%, Elapsed Time: 4.18e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 93.7%, Elapsed Time: 4.2e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.0%, Elapsed Time: 4.23e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.4%, Elapsed Time: 4.25e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 94.7%, Elapsed Time: 4.27e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.1%, Elapsed Time: 4.29e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.4%, Elapsed Time: 4.32e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 95.8%, Elapsed Time: 4.34e+03 s\n", + "Simulation time: 2.7e+02 s, Percentage done: 96.1%, Elapsed Time: 4.36e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 96.5%, Elapsed Time: 4.38e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 96.8%, Elapsed Time: 4.41e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.2%, Elapsed Time: 4.43e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.5%, Elapsed Time: 4.45e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 97.9%, Elapsed Time: 4.47e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.2%, Elapsed Time: 4.5e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.6%, Elapsed Time: 4.52e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 98.9%, Elapsed Time: 4.54e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 99.3%, Elapsed Time: 4.57e+03 s\n", + "Simulation time: 2.8e+02 s, Percentage done: 99.6%, Elapsed Time: 4.59e+03 s\n", + "Simulation time: 2.9e+02 s, Percentage done: 1e+02%, Elapsed Time: 4.61e+03 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 46%|████▋ | 44954/96874 [00:17<00:20, 2521.42it/s]" + ] + }, + { + "data": { + "image/png": "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j/UTJ05k06ZNdOvWjfDwcC5fvswnn3xCuXLluP/++3PUzsKWH/slrbp16zJw4EA+++wzoqOjad26NTt27GDRokU8/PDDPPDAA/n6HrRaLW+//TZPPvlkunVDhgxh3rx5DBo0iN27dxMREcH333/Pli1bmDlzJn5+foBzmGiLFi0YOXIkp0+fpmbNmixfvjzDHpyPP/6Y+++/n9q1a/PMM89QsWJFoqKi2LZtG+fPn2f//v2ZtrVjx47plrm+YGjdurVHEtO8eXPq169Po0aNCAgIYM+ePcyfP5+wsLB0926bNm0aDz30EB07dqRv3778+++/zJkzh6efftqjd7F37940bdqUJ598kkOHDhEUFMQnn3yC3W73SFY3btzIyy+/TO/evalSpQoWi4XNmzezfPlyGjVqVGxvxi7EXakIKyEKIUSBSVv63eWzzz5TGzZsqHp5eal+fn5q7dq11REjRqgXL150x4SHh6vdunVL91zSlL1W1ZvlwqdNm+Ze5iqffeLECbVjx46qt7e3GhwcrI4bN0612+352iZVVdWff/5ZrVOnjmoymdSIiAh1ypQp6vz589OVbY+MjFS7deum+vn5qYBHGfjdu3erTZo0UQ0Gg1q+fHl1xowZmZZ+z6wdcXFx6qhRo9TKlSurBoNBDQoKUps3b65+8MEHqsViyfA5afXv318F1Pbt26dbt379erVHjx5qaGioajAY1NDQUPWxxx5LV1Y9K3kp/Z629Lqqqmrr1q3VWrVqpVue0f65lf2S2etbrVZ1woQJaoUKFVS9Xq+GhYWpo0aN8iiXnll78vp6lSpVyvAzEBUVpT755JNqUFCQajAY1Nq1a3vsQ5dr166pTzzxhOrv768GBASoTzzxhLp37950+1xVVfXEiRPqgAED1JCQEFWv16v33HOP+uCDD6rff/99jt+LS2al399++221Xr16akBAgKrX69Xy5curzz//vBoZGZnhdn788Ue1Xr16qtFoVMuVK6eOHj06w+N3/fp1dfDgwWqpUqVUb29vtXXr1ule+/jx4+qAAQPUihUrql5eXqrJZFJr1aqljhs3To2Pj8/1exRC3L4UVc3DrG4hhBCZGjRoEN9//72UcBZCCCHucjJnSwghhBBCCCEKgCRbQgghhBBCCFEAJNkSQgghhBBCiAIgc7aEEEIIIYQQogBIz5YQQgghhBBC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GTKEKVOmeMS89dZbdO3alYoVK/L888/TtWtXj+13796drl27UqVKFapWrco777yDr68vf//9d7ZtuBWSbAkhRCFJPVXDLtmWEOIOsGTJEsaOHcs777zD4cOHeffddxkzZgyLFi3yiBs3bhyjR49mz5496HQ6+vXrx4gRI5g1axabN2/m+PHjjB071uM569ev5/Dhw2zcuJFvvvmG5cuXM2HChCzbk5iYyDvvvMOXX37Jli1biI6Opm/fvu71mzdvZsCAAbzyyiscOnSIefPmsXDhQt555x0Adu7cCcCCBQu4dOkSO3fuJCAggHr16rFx40YADhw4gKIo7N271z387s8//6R169aAc8hap06d8PPzY/PmzWzZsgVfX186d+7sTha//fZbxo8fn+1+e/vttxk2bBj79u2jatWqPPbYY1n2SjZv3pxly5Zx/fp1HA4HS5cuJTk5mTZt2gDOQiwGg8GjEIuXlxcAf/31V4bbvHjxIsuXL3e/v8z4+fmxcOFCDh06xKxZs/j888/58MMPPWJOnDjBihUrWLlyJStXruTPP//k/fffd68fPnw4f/75Jz/99BNr165l48aN7NmzJ8vXNZvN6eYeenl5sWPHDneyl1lMZu/ZbrezdOlSEhISaNasWZavf6sk2RJCiEKSes6WlH4XQtwJxo0bx/Tp0+nVqxcVKlSgV69evPbaa8ybN88jbtiwYXTq1IkaNWrwyiuvsHv3bsaMGUOLFi2oX78+gwcPZsOGDR7PMRgMzJ8/n1q1atGtWzcmTpzI7NmzcTgcmbbHarUyZ84cmjVrRsOGDVm0aBFbt25lx44dAEyYMIGRI0cycOBAKlasSIcOHZg0aZK7vaVLlwYgMDCQkJAQ9+M2bdq4k62NGzfSoUMHatSo4b5Y37hxozsZWbZsGQ6Hgy+++ILatWtTo0YNFixYwNmzZ93beP/995k2bVqO9lu3bt2oWrUqEyZM4MyZM+4eqIx8++23WK1WSpUqhdFo5Nlnn+XHH3+kcuXKALRt25bIyEimTZuGxWLhxo0bjBw5EvAcLgrw2GOP4e3tzT333IO/vz9ffPFFpq8LzqF6zZs3JyIigu7duzNs2DC+/fZbjxiHw8HChQu59957admyJU888QTr168HID4+nv/973988MEHtGvXjtq1a7No0aJsh7x26tSJL774gt27d6OqKrt2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yVSqVIkGDRowbNgw9u3bh9VqBWDx4sU8++yz9OnTh4oVK9K3b18GDhzItGnTPPZXz549qVGjBpUqVeKVV16hTp06/PXXX9kfGHFHk2RLCCEKiZR+F+LuFViuHBp/f/D1Tf/zyCOewWXKZBzn6wtdunjGRkRkHJdHTz31FAsWLHA/nj9/Pk8++WSOnjt9+nQaNWrE3r17eeGFF3j++ec5cuRIrtuwZMkSxo4dyzvvvMPhw4d59913GTNmDIsWLfKIGzduHKNHj2bPnj3odDr69evHiBEjmDVrFps3b+b48eOMHTvW4znr16/n8OHDbNy4kW+++Ybly5czYcKETNvSsGFDNBoNCxYswG63ExMTw+LFi2nfvj16vR4As9mMyWTyeJ7JZGLHjh3uhCw1VVVZv349R44coVWrVrneP+LOIsmWEEIUEqlGKIS43T3++OP89ddfnDlzhjNnzrBlyxYef/zxHD23a9euvPDCC1SuXJk333yToKAgNmzYkOs2jBs3junTp9OrVy8qVKhAr169eO2115g3b55H3LBhw+jUqRM1atTglVdeYffu3YwZM4YWLVpQv359Bg8enO71DQYD8+fPp1atWnTr1o2JEycye/ZsHA5Hhm2pUKECa9eu5a233sJoNBIYGMj58+f59ttv3TGdOnXiiy++YPfu3aiqyq5du1i8eDFWq5WrV6+642JiYvD19cVgMNCtWzc++ugjOnTokOv9I+4suqJugBBC3C2kZ0uIu1f0+fP4+/uj0WTwPbdW6/n48uXMN5T2+WkKNdyq0qVL061bNxYuXIiqqnTr1o2goKAcPbdOnTru/7uGBV7O6r1kICEhgRMnTjB48GCeeeYZ93KbzUZAQECmrxccHAxA7dq1PZalff26devi7e3tftysWTPi4+M5d+4c4eHh6doTGRnJM888w8CBA3nssceIi4tj7Nix9O7dm3Xr1qEoCmPGjCEyMpKmTZuiqirBwcH07duX2bNnexxvPz8/9u3bR3x8POvXr+f111+nYsWKtGnTJlf7SNxZJNkSQohCkjq9yuRLVCFEceXj4/zJKNnKKDY3281nTz31FEOHDgWcVfZyyjWszkVRlEx7jDITHx8PwOeff06TJk081mnTJKWpX09RlAyX5fb10/r4448JCAhg6tSp7mVfffUVYWFhbN++naZNm+Ll5cX8+fOZN28e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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:38<00:00, 2511.21it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The average time taken between temperatures 893-993 for all nodes is: 30.459131449098834 seconds.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from gamma_model_simulator import GammaModelSimulator\n", + "import zarr\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\n", + "def run_simulation_and_analyze(INPUT_DATA_DIR, SIM_DIR_NAME, LASER_FILE, ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, collection_rate=0.02, plot_graph=False):\n", + "\n", + " # Create an instance of the simulator\n", + " simulator = GammaModelSimulator(\n", + " input_data_dir=INPUT_DATA_DIR,\n", + " sim_dir_name=SIM_DIR_NAME,\n", + " laser_file=LASER_FILE)\n", + "\n", + " # Set up the simulation\n", + " simulator.setup_simulation()\n", + "\n", + " # Run the simulation\n", + " simulator.run_simulation()\n", + "\n", + " # Open the zarr file\n", + " zarr_array = zarr.open(ZARR_LOCATION, mode='r')\n", + "\n", + " # Convert the zarr array into a pandas DataFrame\n", + " df = pd.DataFrame(zarr_array[:])\n", + "\n", + " return calculate_time(df, min_temp, max_temp, selected_nodes_list, collection_rate, plot_graph)\n", + "\n", + "# Parameters\n", + "INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + "SIM_DIR_NAME = \"thin_wall\"\n", + "LASER_FILE = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + "ZARR_LOCATION = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.zarr/ff_dt_temperature\"\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + "# Call function\n", + "avg_time = run_simulation_and_analyze(INPUT_DATA_DIR, SIM_DIR_NAME, LASER_FILE, ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating class to get the heat treatment time" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import zarr\n", + "import pandas as pd\n", + "from tqdm import tqdm\n", + "from gamma_model_simulator import GammaModelSimulator\n", + "\n", + "class TemperatureAnalyzer:\n", + "\n", + " def __init__(self, input_data_dir, sim_dir_name, laser_file):\n", + " self.INPUT_DATA_DIR = input_data_dir\n", + " self.SIM_DIR_NAME = sim_dir_name\n", + " self.LASER_FILE = laser_file\n", + "\n", + " def calculate_time(self, df, min_temp, max_temp, selected_nodes, collection_rate=0.02, plot_graph=False): # Notice 'self' added as the first argument\n", + " total_time_list = []\n", + " \n", + " for column in tqdm(df.columns, desc=\"Processing nodes\"):\n", + " time_axis = np.arange(0, df[column].size * collection_rate, collection_rate)\n", + " \n", + " # Find indices where temperature is within the desired range\n", + " in_range_indices = np.where((df[column] >= min_temp) & (df[column] <= max_temp))[0]\n", + " \n", + " # Check if there are any in-range values\n", + " if len(in_range_indices) == 0:\n", + " total_time_list.append(0)\n", + " continue\n", + "\n", + " # Calculate time between first and last in-range value for this column\n", + " time_diff = (in_range_indices[-1] - in_range_indices[0]) * collection_rate\n", + " total_time_list.append(time_diff)\n", + " \n", + " # If plotting is enabled and this column is one of the selected nodes, then plot\n", + " if plot_graph and str(column) in selected_nodes:\n", + " plt.figure(figsize=(10,5))\n", + " plt.plot(time_axis, df[column], label=f\"Node {column}\")\n", + " if len(in_range_indices) > 0:\n", + " plt.fill_between(time_axis, \n", + " min_temp, \n", + " max_temp, \n", + " where=((df[column] >= min_temp) & (df[column] <= max_temp)),\n", + " color='gray', alpha=0.5, label=f\"Temp between {min_temp} and {max_temp}\")\n", + " \n", + " # Adding horizontal lines for min and max temperature\n", + " plt.axhline(min_temp, color='red', linestyle='--', label=f\"Min Temp {min_temp}\")\n", + " plt.axhline(max_temp, color='blue', linestyle='--', label=f\"Max Temp {max_temp}\")\n", + "\n", + " plt.xlabel(\"Time (seconds)\")\n", + " plt.ylabel(\"Temperature\")\n", + " plt.title(f\"Temperature vs Time for Node {column}\")\n", + " plt.legend()\n", + " plt.grid(True)\n", + "\n", + " # Save the figure to the same directory as the zarr file, with a specific filename for the node\n", + " figure_path = os.path.join(os.path.dirname(zarr_location), f\"Node_{column}_Temperature_vs_Time.png\")\n", + " plt.savefig(figure_path) # Save the figure first\n", + " plt.show() # Then show the figure\n", + " \n", + " return np.mean(total_time_list) \n", + "\n", + " def run_simulation_and_analyze(self, zarr_location, min_temp, max_temp, selected_nodes_list, collection_rate=0.02, plot_graph=False):\n", + " # Create an instance of the simulator\n", + " simulator = GammaModelSimulator(\n", + " input_data_dir=self.INPUT_DATA_DIR,\n", + " sim_dir_name=self.SIM_DIR_NAME,\n", + " laser_file=self.LASER_FILE)\n", + "\n", + " # Set up the simulation\n", + " simulator.setup_simulation()\n", + "\n", + " # Run the simulation\n", + " simulator.run_simulation()\n", + "\n", + " # Open the zarr file\n", + " zarr_array = zarr.open(zarr_location, mode='r')\n", + "\n", + " # Convert the zarr array into a pandas DataFrame\n", + " df = pd.DataFrame(zarr_array[:])\n", + "\n", + " return self.calculate_time(df, min_temp, max_temp, selected_nodes_list, collection_rate, plot_graph)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example usage:\n", + "analyzer = TemperatureAnalyzer(\n", + " \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\",\n", + " \"thin_wall\",\n", + " \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP\"\n", + ")\n", + "\n", + "ZARR_LOCATION = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP.zarr/ff_dt_temperature\"\n", + "min_temp, max_temp = 893, 993 # Example thresholds\n", + "selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + "avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + "print(f\"The average time taken between temperatures {min_temp}-{max_temp} for all nodes is: {avg_time} seconds.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# Define the neural network parameters in the following function:\n", + "def objective(params, iteration_number, min_temp=893, max_temp=993):\n", + " # Generate and save the Fourier series\n", + " generator = FourierSeriesGenerator()\n", + " base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + " \n", + " # We use the iteration_number parameter in the plot_and_save method now\n", + " generator.plot_and_save(params, base_path, iteration_number, total_time=30, time_step=0.002)\n", + "\n", + " # Paths for the simulator\n", + " INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + " SIM_DIR_NAME = \"thin_wall\"\n", + " \n", + " # Modify LASER_FILE to reflect the correct iteration and CSV filename\n", + " LASER_FILE = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data\")\n", + "\n", + " # Modify ZARR_LOCATION to reflect the correct iteration\n", + " ZARR_LOCATION = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data.zarr\", \"ff_dt_temperature\")\n", + " \n", + " min_temp, max_temp = 893, 993 # Example thresholds\n", + " selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + " analyzer = TemperatureAnalyzer(\n", + " INPUT_DATA_DIR,\n", + " SIM_DIR_NAME,\n", + " LASER_FILE\n", + " )\n", + "\n", + " # Call function\n", + " avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + " return avg_time # Now returns a 1D tensor\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# Initialize an empty list to store the results\n", + "results = []\n", + "\n", + "# Loop for 3 iterations\n", + "for iteration in range(1, 4): # 1 to 3 inclusive\n", + " params = np.random.rand(6)\n", + " avg_time = objective(params, iteration_number=iteration)\n", + " print(f\"Iteration {iteration}: Average Time = {avg_time}\")\n", + "\n", + " # Append the current iteration's data to the results list\n", + " results.append({\n", + " 'Iteration': iteration,\n", + " 'Param1': params[0],\n", + " 'Param2': params[1],\n", + " 'Param3': params[2],\n", + " 'Param4': params[3],\n", + " 'Param5': params[4],\n", + " 'Param6': params[5],\n", + " 'Average_Time': avg_time\n", + " })\n", + "\n", + "# Convert the results list to a DataFrame\n", + "df = pd.DataFrame(results)\n", + "\n", + "# Optionally, save the DataFrame to a CSV file\n", + "df.to_csv(\"iterations_results.csv\", index=False)\n", + "\n", + "# Print the DataFrame\n", + "print(df)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import torch\n", + "\n", + "# Load Excel data into a Pandas DataFrame\n", + "train_Y = pd.read_excel(\"avg_heat_treatment_times.xlsx\")\n", + "\n", + "# Convert DataFrame to NumPy array and then to PyTorch tensor\n", + "train_Y_np = train_Y[[\"Average Heat Treatment Time\"]].values\n", + "train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) # Specify dtype if needed\n", + "\n", + "# Now train_X_torch is a PyTorch tensor\n", + "train_Y = train_Y_torch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bayesian Optimization Loop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from botorch.fit import fit_gpytorch_model\n", + "import torch\n", + "from botorch.models import SingleTaskGP\n", + "from gpytorch.mlls import ExactMarginalLogLikelihood\n", + "from botorch.optim import optimize_acqf\n", + "from botorch.acquisition import UpperConfidenceBound\n", + "from torch.quasirandom import SobolEngine\n", + "from tqdm import tqdm # Import the tqdm module\n", + "from botorch.acquisition.objective import ScalarizedPosteriorTransform\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "# Generate 10 initial random points\n", + "# Load Excel data into a Pandas DataFrame\n", + "train_X = pd.read_excel(\"optimized_params.xlsx\")\n", + "\n", + "# Convert DataFrame to NumPy array and then to PyTorch tensor\n", + "train_X_np = train_X[[\"n\", \"freq\", \"amplitude\", \"phase\", \"trend\", \"seasonality\"]].values\n", + "train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) # Specify dtype if needed\n", + "\n", + "# Now train_X_torch is a PyTorch tensor\n", + "train_X = train_X_torch\n", + "\n", + "params = train_X[0]\n", + "\n", + "# Assume you have a 2-output model and you want to combine the outputs with equal weight\n", + "weights = torch.tensor([0.5]) # Change this to suit your model and task\n", + "\n", + "posterior_transform = ScalarizedPosteriorTransform(weights)\n", + "\n", + "input_size = np.shape(params)[0]\n", + "\n", + "bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.double)\n", + "\n", + "\n", + "\n", + "def initialize_model(bounds):\n", + "\n", + " # Generate 10 initial random points\n", + " # Load Excel data into a Pandas DataFrame\n", + " train_X = pd.read_excel(\"optimized_params.xlsx\")\n", + "\n", + " # Convert DataFrame to NumPy array and then to PyTorch tensor\n", + " train_X_np = train_X[[\"n\", \"freq\", \"amplitude\", \"phase\", \"trend\", \"seasonality\"]].values\n", + " train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) # Specify dtype if needed\n", + "\n", + " # Now train_X_torch is a PyTorch tensor\n", + " train_X = train_X_torch\n", + " # Convert parameters to a suitable format and calculate corresponding Y values\n", + "\n", + "\n", + " # Load Excel data into a Pandas DataFrame\n", + " train_Y = pd.read_excel(\"avg_heat_treatment_times.xlsx\")\n", + "\n", + " # Convert DataFrame to NumPy array and then to PyTorch tensor\n", + " train_Y_np = train_Y[[\"Average Heat Treatment Time\"]].values\n", + " train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) # Specify dtype if needed\n", + "\n", + " # Now train_X_torch is a PyTorch tensor\n", + " train_Y = train_Y_torch # Fit a GP model\n", + " gp = SingleTaskGP(train_X, train_Y)\n", + " mll = ExactMarginalLogLikelihood(gp.likelihood, gp)\n", + " fit_gpytorch_model(mll)\n", + " return gp\n", + "\n", + " \n", + "def optimize(bounds, n_steps=100):\n", + " gp = initialize_model(bounds)\n", + " best_value = -float('inf') # Initialize with negative infinity\n", + " best_params = None\n", + "\n", + " # Lists to store optimization history\n", + " param_history = []\n", + " value_history = []\n", + " uncertainty_history = [] # Create a list to store the uncertainty at each step\n", + "\n", + " for i in tqdm(range(n_steps)):\n", + " UCB = UpperConfidenceBound(gp, beta=0.5)\n", + " candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20)\n", + " candidate_numpy = candidate.detach().numpy()\n", + " candidate_numpy = np.array(candidate_numpy.flatten())\n", + " param_dict_from_array = candidate_numpy\n", + " # We use the iteration_number parameter in the plot_and_save method now\n", + " y = generator.plot_and_save(params, base_path, i, total_time=30, time_step=0.002)\n", + " new_Y = objective(param_dict_from_array, iteration = i).unsqueeze(0)\n", + "\n", + " # Calculate the posterior and its variance\n", + " gp_posterior = gp.posterior(candidate)\n", + " variance = gp_posterior.variance # This is the uncertainty at the current step\n", + " uncertainty_history.append(variance.item()) # Append the uncertainty to the history list\n", + "\n", + " if new_Y.item() > best_value: # Assumes maximization\n", + " best_value = new_Y.item()\n", + " best_params = param_dict_from_array\n", + "\n", + " param_history.append(param_dict_from_array)\n", + " value_history.append(new_Y.item())\n", + "\n", + " # Update the GP model with the new data\n", + " gp = SingleTaskGP(\n", + " torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy).unsqueeze(0)]),\n", + " torch.cat([gp.train_targets.unsqueeze(0).view(-1, 1), new_Y.unsqueeze(0)], dim=0) # Explicitly specify the dimension for concatenation\n", + " )\n", + " mll = ExactMarginalLogLikelihood(gp.likelihood, gp)\n", + " fit_gpytorch_model(mll)\n", + "\n", + " return gp, best_params, best_value, param_history, value_history, uncertainty_history\n", + "\n", + "x = np.linspace(0, 100, 1000)\n", + "# Run the optimization\n", + "optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(x, bounds)\n", + "\n", + "print(f'Best parameters: {best_params}, Best value: {best_value}')\n", + "# Print out the uncertainty history\n", + "print('Uncertainty at each step:', uncertainty_history)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "generator = FourierSeriesGenerator()\n", + "base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + "\n", + "# We use the iteration_number parameter in the plot_and_save method now\n", + "generator.plot_and_save(params, base_path, iteration_number, total_time=30, time_step=0.002)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/5 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.152405023574829\n", + "Time of calculating critical timestep: 0.07954668998718262\n", + "Time of reading and interpolating toolpath: 0.03495383262634277\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.4856138229370117\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.29 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:18<00:00, 5294.93it/s]\n", + " 20%|██ | 1/5 [00:29<01:59, 29.96s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[0.0006]], dtype=torch.float64)\n", + "[0.46627662 0.85459304 0.5544952 0.556616 0.48527765 0.92964506]\n" + ] + }, + { + "data": { + "image/png": "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jNHAgQOrdCcWAAA1ZbFYqnwpyZNat259w3k1P+fldfWiz8+D0c1e1fDLS2E2m03du3fXvHnzdPfdd2vevHkaNWqUfX1JSYn69eunN95447p91eRFn7/Go5ex/u3f/k2LFy/W/Pnzdccdd+iVV17Re++9Zx/u8vb21t///nf7BKp+/frp3Llz+u6779S2bVv7fubOnavY2Fj16NFDffv2VefOne2BCQAAXBUSEqJevXpp6tSpunjx4nXrCwsL1bx5c0nSqVOn7O0/n6z8a9LT07Vw4UJt2LBBR44c0cCBA+3rOnTooL179+r2229XdHS0w3KjOUSu4tHn7NQVPGcHAOCM+vycnSNHjiglJUUhISF6+eWX1a5dO5WXl2vlypXKysrS/v37lZycLF9fX/35z3/WmTNn9Nxzz2nz5s1avXq1unbtqjVr1qhbt246f/68rFarw/4vXLigsLAwxcTEqFmzZlq1apV93cmTJ9W+fXvdc889eu655xQSEqLDhw9rwYIF+vjjj2/4VvN6/5wdAABQu6KiorR9+3Z169ZNzzzzjO644w799re/1TfffKOsrCxJ0qxZs1ReXq6OHTvq6aef1quvvlrl/Tdp0kT9+vXTrl277FdqromIiND69etVUVGhnj17Kj4+Xk8//bSsVqv98pk7MLIjRnYAAM6pzyM79Q0jOwAAAL+CsAMAAEyNsAMAAEyNsAMAQDUx7dX9XNHHhB0AAJzk6+srSSotLfVwJeZ3rY+v9Xl11P3HPQIAUMd4e3vLarXa383YsGFDWSwWD1dlLoZhqLS0VGfOnJHVar3hM3iqirADAEA1XHvZ9C9fRg3XslqtN32xd1URdgAAqAaLxaLw8HCFhobe9N1RqBlfX98ajehcQ9gBAKAGvL29XfKDDPdhgjIAADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1j4edH3/8UY8++qiaNm2qgIAAxcfHa+vWrZKksrIyjR8/XvHx8WrUqJEiIiI0ZMgQnTx50mEfBQUFSk9PV2BgoKxWq4YPH66SkhJPnA4AAKhjPBp2zp8/r5SUFPn6+mr58uXat2+f3n77bQUHB0uSSktLtX37dr344ovavn27vvjiCx04cED33Xefw37S09O1d+9erVy5UkuXLtXatWs1cuRIT5wSAACoYyyGYRieOviECRO0fv16fffdd1X+zpYtW3TXXXfphx9+0G233ab9+/crLi5OW7ZsUWJioiQpOztbffv21YkTJxQREfGr+ywuLlZQUJCKiooUGBhY7fMBAAC1p6q/3x4d2VmyZIkSExM1YMAAhYaGKiEhQTNmzPin3ykqKpLFYpHVapUkbdiwQVar1R50JCk1NVVeXl7atGnTDfdx+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDk33P7SpUsaP368Bg0aZE9w+fn5Cg0NddjOx8dHISEhys/Pv+F+pkyZoqCgIPsSGRnp2hMDAAB1hkfDTmVlpTp06KDMzEwlJCRo5MiRGjFihKZNm3bdtmVlZUpLS5NhGMrKyqrRcSdOnKiioiL7cvz48RrtDwAA1F0eDTvh4eGKi4tzaGvTpo3y8vIc2q4FnR9++EErV650uC5ns9l05swZh+3Ly8tVUFAgm812w+P6+/srMDDQYQEAAObk0bCTkpKiAwcOOLQdPHhQLVq0sH++FnQOHTqkVatWqWnTpg7bJycnq7CwUNu2bbO35eTkqLKyUklJSe49AQAAUOf5ePLgY8eOVadOnZSZmam0tDRt3rxZ06dP1/Tp0yVdDTr/+Z//qe3bt2vp0qWqqKiwz8MJCQmRn5+f2rRpo969e9svf5WVlWnMmDEaOHBgle7EAgAA5ubRW88laenSpZo4caIOHTqkli1bKiMjQyNGjJAkHTt2TC1btrzh91avXq2uXbtKuvpQwTFjxujLL7+Ul5eX+vfvr/fff1+NGzeuUg3ceg4AQP1T1d9vj4eduoCwAwBA/VMvnrMDAADgboQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgah4POz/++KMeffRRNW3aVAEBAYqPj9fWrVvt67/44gv17NlTTZs2lcVi0c6dO6/bx6VLlzR69Gg1bdpUjRs3Vv/+/XX69OlaPAsAAFBXeTTsnD9/XikpKfL19dXy5cu1b98+vf322woODrZvc/HiRXXu3FlvvPHGTfczduxYffnll/r000/17bff6uTJk3rooYdq4xQAAEAd5+PJg7/xxhuKjIzUJ598Ym9r2bKlwzaDBw+WJB07duyG+ygqKtLMmTM1b948de/eXZL0ySefqE2bNtq4caPuvvtu9xQPAADqBY+O7CxZskSJiYkaMGCAQkNDlZCQoBkzZji1j23btqmsrEypqan2ttjYWN12223asGHDDb9z+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDlV3kd+fr78/PxktVod2sPCwpSfn3/D70yZMkVBQUH2JTIysianAQAA6jCPhp3Kykp16NBBmZmZSkhI0MiRIzVixAhNmzbNrcedOHGiioqK7Mvx48fdejwAAOA5Hg074eHhiouLc2hr06aN8vLyqrwPm82mK1euqLCw0KH99OnTstlsN/yOv7+/AgMDHRYAAGBOHg07KSkpOnDggEPbwYMH1aJFiyrvo2PHjvL19dU333xjbztw4IDy8vKUnJzssloBAED95NG7scaOHatOnTopMzNTaWlp2rx5s6ZPn67p06fbtykoKFBeXp5OnjwpSfZwZLPZZLPZFBQUpOHDhysjI0MhISEKDAzUk08+qeTkZO7EAgAAshiGYXiygKVLl2rixIk6dOiQWrZsqYyMDI0YMcK+fvbs2Ro2bNh135s0aZImT54s6epDBZ955hnNnz9fly9fVq9evfTRRx/d9DLWLxUXFysoKEhFRUVc0gIAoJ6o6u+3x8NOXUDYAQCg/qnq77fHXxcBAADgToQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.1221702098846436\n", + "Time of calculating critical timestep: 0.07848143577575684\n", + "Time of reading and interpolating toolpath: 0.03400301933288574\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.48352932929992676\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 8.98 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:16<00:00, 5703.71it/s]\n", + " 40%|████ | 2/5 [00:58<01:26, 28.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[0.0005]], dtype=torch.float64)\n", + "[1. 0. 0.85323197 0. 1. 0. ]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAGwCAYAAAC5ACFFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAulElEQVR4nO3de3RUVZ728adCbtyS4poiEEQgdEAjYGhCUAaENEFshAZHjBGQRhkR8BJEQBGWtop3wAZhtKUdWpA0ajMjI9AY8AbhFhAJV0UEFCoBYhIgkoTkvH/4UmM1YZuCqlQqfj9rnQXZZ++q394rUo+ndp2yWZZlCQAAAJUK8ncBAAAANRlhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABsH+LqA2qKio0LFjx9SwYUPZbDZ/lwMAAKrAsiydPn1a0dHRCgq69PUjwpIXHDt2TDExMf4uAwAAXIajR4+qVatWlzxPWPKChg0bSvppsSMiIvxcDQAAqIqioiLFxMS4XscvhbDkBRfeeouIiCAsAQAQYH5pCw0bvAEAAAwISwAAAAaEJQAAAAP2LAEA4CcVFRUqLS31dxm1VkhIiOrUqXPFj0NYAgDAD0pLS3Xo0CFVVFT4u5RazW63y+FwXNF9EAlLAABUM8uydPz4cdWpU0cxMTHGGyLi8liWpeLiYuXl5UmSWrRocdmPRVgCAKCanT9/XsXFxYqOjla9evX8XU6tVbduXUlSXl6emjdvftlvyRFlAQCoZuXl5ZKk0NBQP1dS+10Io2VlZZf9GIQlAAD8hO8T9T1vrDFhCQAAwICwBAAAYEBYAgAAMCAsAQAAjzidTk2cOFFt27ZVWFiYYmJiNGjQIGVmZvq7NJ/g1gEAAKDKvv32W91www2y2+168cUXFR8fr7KyMq1Zs0bjx4/Xvn37PH5My7JUXl6u4OCaGUu4sgQAgJ9ZlqXi0vN+OSzL8qjW+++/XzabTVu2bNGwYcPUoUMHXXPNNUpPT9emTZv07bffymaz6YsvvnCNKSgokM1m08cffyxJ+vjjj2Wz2bRq1SolJCQoLCxMixYtks1muyhszZ49W+3atXP9nJOTo5tvvlkNGjRQVFSURowYoZMnT1722ldFzYxwAAD8ivxYVq5OM9b45bn3PJWieqFViwP5+flavXq1nnnmGdWvX/+i83a7XQUFBVV+7qlTp+qll15S27Zt1ahRI73xxhtasmSJ/vSnP7n6LFmyRHfeeaekn0JX3759dc8992j27Nn68ccfNWXKFN1+++1at25dlZ/XU1xZAgAAVfL111/LsizFxcV55fGeeuop/e53v1O7du3UuHFjpaWl6Z133nGdP3DggLKzs5WWliZJmjdvnrp27apnn31WcXFx6tq1qxYtWqT169frwIEDXqmpMlxZAgDAz+qG1NGep1L89txV5elbdr+kW7dubj/fcccdeuSRR7Rp0yb16NFDS5Ys0fXXX+8KZzt37tT69evVoEGDix7r4MGD6tChg1fru4CwBACAn9lstiq/FeZPsbGxle4r+rkLXwr882B1qa8a+de38hwOh/r27aulS5eqR48eWrp0qcaNG+c6f+bMGQ0aNEjPP//8RY91JV+U+0t4Gw4AAFRJ48aNlZKSovnz5+vs2bMXnS8oKFCzZs0kScePH3e1/3yz9y9JS0tTRkaGsrKy9M033+iOO+5wnbv++uu1e/dutWnTRu3bt3c7KttD5S2EJQAAUGXz589XeXm5unfvrvfee09fffWV9u7dq1dffVVJSUmqW7euevTooeeee0579+7VJ598ounTp1f58YcOHarTp09r3LhxuummmxQdHe06N378eOXn5ys1NVVbt27VwYMHtWbNGo0ePdr15cS+QFgCAABV1rZtW23fvl033XSTJk2apGuvvVa/+93vlJmZqQULFkiSFi1apPPnzyshIUEPPfSQnn766So/fsOGDTVo0CDt3LnTtbH7gujoaG3YsEHl5eXq37+/4uPj9dBDD8lut7ve/vMFm+Xt3Vq/QkVFRYqMjFRhYaEiIiL8XQ4AoIY7d+6cDh06pKuvvlrh4eH+LqdWM611VV+/ubIEAABgQFgCAAAwICwBAAAYEJYAAPATtg37njfWmLAEAEA1q1Pnp7tml5aW+rmS2q+4uFiSFBISctmPUfNvFwoAQC0THBysevXq6cSJEwoJCfHpx95/rSzLUnFxsfLy8mS3210B9XIQlgAAqGY2m00tWrTQoUOHdPjwYX+XU6vZ7XY5HI4regzCEgAAfhAaGqrY2FjeivOhkJCQK7qidAFhCQAAPwkKCuKmlAGAN0kBAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAA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NWvWVGnj8bvvvutq27dvn9vG46+//tratWuX61i0aJElydq4ceMlP9lRm/lqnS3LsnJycqzmzZtbkydP9t0Eaqju3btbEyZMcP1cXl5utWzZ0rgh9ve//71bW1JS0kUbvF966SXX+cLCQjZ4e3mdLcuySktLrSFDhljXXHONlZeX55vCA4y31/nkyZNu/w7v2rXLio6OtqZMmWLt27fPdxMJAIQleGzAgAFW165drc2bN1uff/65FRsb6/aR9u+++876zW9+Y23evNnVdt9991mtW7e21q1bZ23bts1KSkqykpKSLvkc69ev/1V/Gs6yfLPOu3btspo1a2bddddd1vHjx13Hr+XFZ9myZVZYWJj11ltvWXv27LHGjh1r2e12y+l0WpZlWSNGjLCmTp3q6r9hwwYrODjYeumll6y9e/daM2fOrPTWAXa73frv//5v68svv7QGDx7MrQO8vM6lpaXWrbfearVq1cr64osv3H53S0pK/DLHmsAXv8//ik/D/YSwBI+dOnXKSk1NtRo0aGBFRERYo0ePtk6fPu06f+jQIUuStX79elfbjz/+aN1///1Wo0aNrHr16ll/+MMfrOPHj1/yOQhLvlnnmTNnWpIuOq666qpqnJl//fnPf7Zat25thYaGWt27d7c2bdrkOte7d29r1KhRbv3//ve/Wx06dLBCQ0Ota665xvrf//1ft/MVFRXWE088YUVFRVlhYWFWv379rP3791fHVGo0b67zhd/1yo6f//7/Gnn79/lfEZZ+YrOs/785BAAAABfh03AAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwB+9e6++24NGTLE32UAqKGC/V0AAPiSzWYznp85c6bmzp0rvswAwKUQlgDUasePH3f9PSMjQzNmzND+/ftdbQ0aNFCDBg38URqAAMHbcABqNYfD4ToiIyNls9nc2ho0aHDR23B9+vTRxIkT9dBDD6lRo0aKiorSG2+8obNnz2r06NFq2LCh2rdvr1WrVrk9V05Ojm6++WY1aNBAUVFRGjFihE6ePFnNMwbgbYQlAKjEf/3Xf6lp06basmWLJk6cqHHjxunf//3f1bNnT23fvl39+/fXiBEjVFxcLEkqKChQ37591bVrV23btk2rV69Wbm6ubr/9dj/PBMCVIiwBQCU6d+6s6dOnKzY2VtOmTVN4eLiaNm2qe++9V7GxsZoxY4ZOnTqlL7/8UpI0b948de3aVc8++6zi4uLUtWtXLVq0SOvXr9eBAwf8PBsAV4I9SwBQieuuu8719zp16qhJkyaKj493tUVFRUmS8vLyJEk7d+7U+vXrK93/dPDgQXXo0MHHFQPwFcISAFQiJCTE7WebzebWduFTdhUVFZKkM2fOaNCgQXr++ecveqwWLVr4sFIAvkZYAgAvuP766/Xee++pTZs2Cg7mn1agNmHPEgB4wfjx45Wfn6/U1FRt3bpVBw8e1Jo1azR69GiVl5f7uzwAV4CwBABeEB0drQ0bNqi8vFz9+/dXfHy8HnroIdntdgUF8U8tEMhsFretBQAAuCT+dwcAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMPh/elhEF1ZlISoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.5045843124389648\n", + "Time of calculating critical timestep: 0.07868194580078125\n", + "Time of reading and interpolating toolpath: 0.03462839126586914\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.4686243534088135\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.24 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:18<00:00, 5361.51it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[0.]], dtype=torch.float64)\n", + "[1. 0. 0.3900291 1. 0. 0. ]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 60%|██████ | 3/5 [01:28<00:59, 29.78s/it]" + ] + }, + { + "data": { + "image/png": "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jNHAgQOrdCcWAAA1ZbFYqnwpyZNat259w3k1P+fldfWiz8+D0c1e1fDLS2E2m03du3fXvHnzdPfdd2vevHkaNWqUfX1JSYn69eunN95447p91eRFn7/Go5ex/u3f/k2LFy/W/Pnzdccdd+iVV17Re++9Zx/u8vb21t///nf7BKp+/frp3Llz+u6779S2bVv7fubOnavY2Fj16NFDffv2VefOne2BCQAAXBUSEqJevXpp6tSpunjx4nXrCwsL1bx5c0nSqVOn7O0/n6z8a9LT07Vw4UJt2LBBR44c0cCBA+3rOnTooL179+r2229XdHS0w3KjOUSu4tHn7NQVPGcHAOCM+vycnSNHjiglJUUhISF6+eWX1a5dO5WXl2vlypXKysrS/v37lZycLF9fX/35z3/WmTNn9Nxzz2nz5s1avXq1unbtqjVr1qhbt246f/68rFarw/4vXLigsLAwxcTEqFmzZlq1apV93cmTJ9W+fXvdc889eu655xQSEqLDhw9rwYIF+vjjj2/4VvN6/5wdAABQu6KiorR9+3Z169ZNzzzzjO644w799re/1TfffKOsrCxJ0qxZs1ReXq6OHTvq6aef1quvvlrl/Tdp0kT9+vXTrl277FdqromIiND69etVUVGhnj17Kj4+Xk8//bSsVqv98pk7MLIjRnYAAM6pzyM79Q0jOwAAAL+CsAMAAEyNsAMAAEyNsAMAQDUx7dX9XNHHhB0AAJzk6+srSSotLfVwJeZ3rY+v9Xl11P3HPQIAUMd4e3vLarXa383YsGFDWSwWD1dlLoZhqLS0VGfOnJHVar3hM3iqirADAEA1XHvZ9C9fRg3XslqtN32xd1URdgAAqAaLxaLw8HCFhobe9N1RqBlfX98ajehcQ9gBAKAGvL29XfKDDPdhgjIAADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1j4edH3/8UY8++qiaNm2qgIAAxcfHa+vWrZKksrIyjR8/XvHx8WrUqJEiIiI0ZMgQnTx50mEfBQUFSk9PV2BgoKxWq4YPH66SkhJPnA4AAKhjPBp2zp8/r5SUFPn6+mr58uXat2+f3n77bQUHB0uSSktLtX37dr344ovavn27vvjiCx04cED33Xefw37S09O1d+9erVy5UkuXLtXatWs1cuRIT5wSAACoYyyGYRieOviECRO0fv16fffdd1X+zpYtW3TXXXfphx9+0G233ab9+/crLi5OW7ZsUWJioiQpOztbffv21YkTJxQREfGr+ywuLlZQUJCKiooUGBhY7fMBAAC1p6q/3x4d2VmyZIkSExM1YMAAhYaGKiEhQTNmzPin3ykqKpLFYpHVapUkbdiwQVar1R50JCk1NVVeXl7atGnTDfdx+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDk33P7SpUsaP368Bg0aZE9w+fn5Cg0NddjOx8dHISEhys/Pv+F+pkyZoqCgIPsSGRnp2hMDAAB1hkfDTmVlpTp06KDMzEwlJCRo5MiRGjFihKZNm3bdtmVlZUpLS5NhGMrKyqrRcSdOnKiioiL7cvz48RrtDwAA1F0eDTvh4eGKi4tzaGvTpo3y8vIc2q4FnR9++EErV650uC5ns9l05swZh+3Ly8tVUFAgm812w+P6+/srMDDQYQEAAObk0bCTkpKiAwcOOLQdPHhQLVq0sH++FnQOHTqkVatWqWnTpg7bJycnq7CwUNu2bbO35eTkqLKyUklJSe49AQAAUOf5ePLgY8eOVadOnZSZmam0tDRt3rxZ06dP1/Tp0yVdDTr/+Z//qe3bt2vp0qWqqKiwz8MJCQmRn5+f2rRpo969e9svf5WVlWnMmDEaOHBgle7EAgAA5ubRW88laenSpZo4caIOHTqkli1bKiMjQyNGjJAkHTt2TC1btrzh91avXq2uXbtKuvpQwTFjxujLL7+Ul5eX+vfvr/fff1+NGzeuUg3ceg4AQP1T1d9vj4eduoCwAwBA/VMvnrMDAADgboQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgah4POz/++KMeffRRNW3aVAEBAYqPj9fWrVvt67/44gv17NlTTZs2lcVi0c6dO6/bx6VLlzR69Gg1bdpUjRs3Vv/+/XX69OlaPAsAAFBXeTTsnD9/XikpKfL19dXy5cu1b98+vf322woODrZvc/HiRXXu3FlvvPHGTfczduxYffnll/r000/17bff6uTJk3rooYdq4xQAAEAd5+PJg7/xxhuKjIzUJ598Ym9r2bKlwzaDBw+WJB07duyG+ygqKtLMmTM1b948de/eXZL0ySefqE2bNtq4caPuvvtu9xQPAADqBY+O7CxZskSJiYkaMGCAQkNDlZCQoBkzZji1j23btqmsrEypqan2ttjYWN12223asGHDDb9z+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDlV3kd+fr78/PxktVod2sPCwpSfn3/D70yZMkVBQUH2JTIysianAQAA6jCPhp3Kykp16NBBmZmZSkhI0MiRIzVixAhNmzbNrcedOHGiioqK7Mvx48fdejwAAOA5Hg074eHhiouLc2hr06aN8vLyqrwPm82mK1euqLCw0KH99OnTstlsN/yOv7+/AgMDHRYAAGBOHg07KSkpOnDggEPbwYMH1aJFiyrvo2PHjvL19dU333xjbztw4IDy8vKUnJzssloBAED95NG7scaOHatOnTopMzNTaWlp2rx5s6ZPn67p06fbtykoKFBeXp5OnjwpSfZwZLPZZLPZFBQUpOHDhysjI0MhISEKDAzUk08+qeTkZO7EAgAAshiGYXiygKVLl2rixIk6dOiQWrZsqYyMDI0YMcK+fvbs2Ro2bNh135s0aZImT54s6epDBZ955hnNnz9fly9fVq9evfTRRx/d9DLWLxUXFysoKEhFRUVc0gIAoJ6o6u+3x8NOXUDYAQCg/qnq77fHXxcBAADgToQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.1366510391235352\n", + "Time of calculating critical timestep: 0.07888650894165039\n", + "Time of reading and interpolating toolpath: 0.03582882881164551\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.4941105842590332\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 9.22 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:17<00:00, 5518.91it/s]\n", + " 80%|████████ | 4/5 [01:58<00:29, 29.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[0.0005]], dtype=torch.float64)\n", + "[0. 1. 0.75916165 0. 0. 0. ]\n" + ] + }, + { + "data": { + "image/png": "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jNHAgQOrdCcWAAA1ZbFYqnwpyZNat259w3k1P+fldfWiz8+D0c1e1fDLS2E2m03du3fXvHnzdPfdd2vevHkaNWqUfX1JSYn69eunN95447p91eRFn7/Go5ex/u3f/k2LFy/W/Pnzdccdd+iVV17Re++9Zx/u8vb21t///nf7BKp+/frp3Llz+u6779S2bVv7fubOnavY2Fj16NFDffv2VefOne2BCQAAXBUSEqJevXpp6tSpunjx4nXrCwsL1bx5c0nSqVOn7O0/n6z8a9LT07Vw4UJt2LBBR44c0cCBA+3rOnTooL179+r2229XdHS0w3KjOUSu4tHn7NQVPGcHAOCM+vycnSNHjiglJUUhISF6+eWX1a5dO5WXl2vlypXKysrS/v37lZycLF9fX/35z3/WmTNn9Nxzz2nz5s1avXq1unbtqjVr1qhbt246f/68rFarw/4vXLigsLAwxcTEqFmzZlq1apV93cmTJ9W+fXvdc889eu655xQSEqLDhw9rwYIF+vjjj2/4VvN6/5wdAABQu6KiorR9+3Z169ZNzzzzjO644w799re/1TfffKOsrCxJ0qxZs1ReXq6OHTvq6aef1quvvlrl/Tdp0kT9+vXTrl277FdqromIiND69etVUVGhnj17Kj4+Xk8//bSsVqv98pk7MLIjRnYAAM6pzyM79Q0jOwAAAL+CsAMAAEyNsAMAAEyNsAMAQDUx7dX9XNHHhB0AAJzk6+srSSotLfVwJeZ3rY+v9Xl11P3HPQIAUMd4e3vLarXa383YsGFDWSwWD1dlLoZhqLS0VGfOnJHVar3hM3iqirADAEA1XHvZ9C9fRg3XslqtN32xd1URdgAAqAaLxaLw8HCFhobe9N1RqBlfX98ajehcQ9gBAKAGvL29XfKDDPdhgjIAADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1j4edH3/8UY8++qiaNm2qgIAAxcfHa+vWrZKksrIyjR8/XvHx8WrUqJEiIiI0ZMgQnTx50mEfBQUFSk9PV2BgoKxWq4YPH66SkhJPnA4AAKhjPBp2zp8/r5SUFPn6+mr58uXat2+f3n77bQUHB0uSSktLtX37dr344ovavn27vvjiCx04cED33Xefw37S09O1d+9erVy5UkuXLtXatWs1cuRIT5wSAACoYyyGYRieOviECRO0fv16fffdd1X+zpYtW3TXXXfphx9+0G233ab9+/crLi5OW7ZsUWJioiQpOztbffv21YkTJxQREfGr+ywuLlZQUJCKiooUGBhY7fMBAAC1p6q/3x4d2VmyZIkSExM1YMAAhYaGKiEhQTNmzPin3ykqKpLFYpHVapUkbdiwQVar1R50JCk1NVVeXl7atGnTDfdx+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDk33P7SpUsaP368Bg0aZE9w+fn5Cg0NddjOx8dHISEhys/Pv+F+pkyZoqCgIPsSGRnp2hMDAAB1hkfDTmVlpTp06KDMzEwlJCRo5MiRGjFihKZNm3bdtmVlZUpLS5NhGMrKyqrRcSdOnKiioiL7cvz48RrtDwAA1F0eDTvh4eGKi4tzaGvTpo3y8vIc2q4FnR9++EErV650uC5ns9l05swZh+3Ly8tVUFAgm812w+P6+/srMDDQYQEAAObk0bCTkpKiAwcOOLQdPHhQLVq0sH++FnQOHTqkVatWqWnTpg7bJycnq7CwUNu2bbO35eTkqLKyUklJSe49AQAAUOf5ePLgY8eOVadOnZSZmam0tDRt3rxZ06dP1/Tp0yVdDTr/+Z//qe3bt2vp0qWqqKiwz8MJCQmRn5+f2rRpo969e9svf5WVlWnMmDEaOHBgle7EAgAA5ubRW88laenSpZo4caIOHTqkli1bKiMjQyNGjJAkHTt2TC1btrzh91avXq2uXbtKuvpQwTFjxujLL7+Ul5eX+vfvr/fff1+NGzeuUg3ceg4AQP1T1d9vj4eduoCwAwBA/VMvnrMDAADgboQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgah4POz/++KMeffRRNW3aVAEBAYqPj9fWrVvt67/44gv17NlTTZs2lcVi0c6dO6/bx6VLlzR69Gg1bdpUjRs3Vv/+/XX69OlaPAsAAFBXeTTsnD9/XikpKfL19dXy5cu1b98+vf322woODrZvc/HiRXXu3FlvvPHGTfczduxYffnll/r000/17bff6uTJk3rooYdq4xQAAEAd5+PJg7/xxhuKjIzUJ598Ym9r2bKlwzaDBw+WJB07duyG+ygqKtLMmTM1b948de/eXZL0ySefqE2bNtq4caPuvvtu9xQPAADqBY+O7CxZskSJiYkaMGCAQkNDlZCQoBkzZji1j23btqmsrEypqan2ttjYWN12223asGHDDb9z+fJlFRcXOywAAMCcPBp2jhw5oqysLLVu3VorVqzQqFGj9NRTT2nOnDlV3kd+fr78/PxktVod2sPCwpSfn3/D70yZMkVBQUH2JTIysianAQAA6jCPhp3Kykp16NBBmZmZSkhI0MiRIzVixAhNmzbNrcedOHGiioqK7Mvx48fdejwAAOA5Hg074eHhiouLc2hr06aN8vLyqrwPm82mK1euqLCw0KH99OnTstlsN/yOv7+/AgMDHRYAAGBOHg07KSkpOnDggEPbwYMH1aJFiyrvo2PHjvL19dU333xjbztw4IDy8vKUnJzssloBAED95NG7scaOHatOnTopMzNTaWlp2rx5s6ZPn67p06fbtykoKFBeXp5OnjwpSfZwZLPZZLPZFBQUpOHDhysjI0MhISEKDAzUk08+qeTkZO7EAgAAshiGYXiygKVLl2rixIk6dOiQWrZsqYyMDI0YMcK+fvbs2Ro2bNh135s0aZImT54s6epDBZ955hnNnz9fly9fVq9evfTRRx/d9DLWLxUXFysoKEhFRUVc0gIAoJ6o6u+3x8NOXUDYAQCg/qnq77fHXxcBAADgToQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time of reading input files: 1.5189075469970703\n", + "Time of calculating critical timestep: 0.07856345176696777\n", + "Time of reading and interpolating toolpath: 0.03384661674499512\n", + "Number of nodes: 96874\n", + "Number of elements: 83270\n", + "Number of time-steps: 142500\n", + "Time of generating surface: 0.5005435943603516\n", + "Simulation time: 1.0 s, Percentage done: 0.351%, Elapsed Time: 8.98 s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing nodes: 100%|██████████| 96874/96874 [00:17<00:00, 5562.06it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[0.0005]], dtype=torch.float64)\n", + "[0. 0. 0. 1. 1. 0.]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 5/5 [02:27<00:00, 29.56s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best parameters: [0.46627662 0.85459304 0.5544952 0.556616 0.48527765 0.92964506], Best value: 0.0005677477961062824\n", + "Uncertainty at each step: [1.276682734489441, 44.11851119995117, 57.199459075927734, 63.148094177246094, 66.31861114501953]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import zarr\n", + "from botorch.fit import fit_gpytorch_model\n", + "import torch\n", + "from botorch.models import SingleTaskGP\n", + "from gpytorch.mlls import ExactMarginalLogLikelihood\n", + "from botorch.optim import optimize_acqf\n", + "from botorch.acquisition import UpperConfidenceBound\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "# Define the neural network parameters in the following function:\n", + "def objective(params, iteration_number, min_temp=893, max_temp=993):\n", + " from fourier_generator import FourierSeriesGenerator\n", + " from temperature_analyzer import TemperatureAnalyzer\n", + "\n", + "\n", + " # Generate and save the Fourier series\n", + " generator = FourierSeriesGenerator()\n", + " base_path = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall\"\n", + " generator.plot_and_save(params, base_path, iteration_number, total_time=1, time_step=0.002)\n", + "\n", + " # Paths for the simulator\n", + " INPUT_DATA_DIR = \"/home/vnk3019/ded_dt_thermomechanical_solver/examples/data\"\n", + " SIM_DIR_NAME = \"thin_wall\"\n", + "\n", + " # Modify LASER_FILE to reflect the correct iteration and CSV filename\n", + " LASER_FILE = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data\")\n", + "\n", + " # Modify ZARR_LOCATION to reflect the correct iteration\n", + " ZARR_LOCATION = os.path.join(base_path, f\"Iteration_{iteration_number}\", \"data.zarr\", \"ff_dt_temperature\")\n", + " \n", + " selected_nodes_list = [\"45003\"] # As an example\n", + "\n", + " analyzer = TemperatureAnalyzer(\n", + " INPUT_DATA_DIR,\n", + " SIM_DIR_NAME,\n", + " LASER_FILE\n", + " )\n", + "\n", + " # Call function\n", + " avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True)\n", + " return torch.tensor(avg_time) # Now returns a 1D tensor\n", + "\n", + "\n", + "\n", + "# Bayesian Optimization functions\n", + "# -----------------------------------------------------------\n", + "def initialize_model():\n", + " train_X = pd.read_excel(\"optimized_params.xlsx\")\n", + " train_X_np = train_X[[\"n\", \"freq\", \"amplitude\", \"phase\", \"trend\", \"seasonality\"]].values\n", + " train_X_torch = torch.tensor(train_X_np, dtype=torch.float32)\n", + " train_Y = pd.read_excel(\"avg_heat_treatment_times.xlsx\")\n", + " train_Y_np = train_Y[[\"Average Heat Treatment Time\"]].values\n", + " train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32)\n", + " gp = SingleTaskGP(train_X_torch.float(), train_Y_torch.float())\n", + " mll = ExactMarginalLogLikelihood(gp.likelihood, gp)\n", + " fit_gpytorch_model(mll)\n", + " return gp\n", + "\n", + "def optimize(bounds, n_steps=5):\n", + " gp = initialize_model()\n", + " best_value = -float('inf')\n", + " best_params = None\n", + "\n", + " param_history = []\n", + " value_history = []\n", + " uncertainty_history = []\n", + "\n", + " # Create an empty dataframe with the required columns\n", + " df = pd.DataFrame(columns=['Parameters', 'Objective Value', 'Uncertainty'])\n", + "\n", + " for i in tqdm(range(n_steps)):\n", + " UCB = UpperConfidenceBound(gp, beta=0.5)\n", + " candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20)\n", + " candidate_numpy = candidate.detach().numpy().flatten()\n", + " new_Y = objective(candidate_numpy, iteration_number=i).unsqueeze(0).unsqueeze(-1)\n", + "\n", + " variance = gp.posterior(candidate).variance\n", + " uncertainty_history.append(variance.item())\n", + "\n", + " print(new_Y)\n", + " print(candidate_numpy)\n", + "\n", + " if new_Y.item() > best_value:\n", + " best_value = new_Y.item()\n", + " best_params = candidate_numpy\n", + "\n", + " param_history.append(candidate_numpy)\n", + " value_history.append(new_Y.item())\n", + "\n", + " # Update the Gaussian Process model\n", + " gp = SingleTaskGP(\n", + " torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy.astype(np.float32)).unsqueeze(0)]),\n", + " torch.cat([gp.train_targets.unsqueeze(-1).float(), new_Y.float()], dim=0)\n", + " )\n", + " mll = ExactMarginalLogLikelihood(gp.likelihood, gp)\n", + " fit_gpytorch_model(mll)\n", + "\n", + " # Save the current iteration results to the dataframe\n", + " df = df.append({\n", + " 'Current Best Parameters': best_params.item(),\n", + " 'Current Best Value': best_value.item(), \n", + " 'Parameters': candidate_numpy.tolist(),\n", + " 'Objective Value': new_Y.item(),\n", + " 'Uncertainty': variance.item()\n", + " }, ignore_index=True)\n", + "\n", + " # Save the dataframe to an Excel file\n", + " df.to_excel('bayesian_optimization_results.xlsx', index=False)\n", + "\n", + " return gp, best_params, best_value, param_history, value_history, uncertainty_history\n", + "# -----------------------------------------------------------\n", + "\n", + "if __name__ == \"__main__\":\n", + " input_size = 6 # Assuming 6 parameters\n", + " bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.float32)\n", + " optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(bounds)\n", + "\n", + " print(f'Best parameters: {best_params}, Best value: {best_value}')\n", + " print('Uncertainty at each step:', uncertainty_history)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gamma", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data/laser_inputs/thin_wall/Iteration_0/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_0/plot.png new file mode 100644 index 0000000..c40ec1c Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_0/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_1/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_1/plot.png new file mode 100644 index 0000000..f0ed9c5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_1/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_10/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_10/plot.png new file mode 100644 index 0000000..f0ed9c5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_10/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_11/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_11/plot.png new file mode 100644 index 0000000..d0f1384 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_11/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_12/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_12/plot.png new file mode 100644 index 0000000..ccf360f Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_12/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_13/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_13/plot.png new file mode 100644 index 0000000..80a4653 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_13/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_14/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_14/plot.png new file mode 100644 index 0000000..25755ed Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_14/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_15/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_15/plot.png new file mode 100644 index 0000000..3ee4e99 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_15/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_16/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_16/plot.png new file mode 100644 index 0000000..f60fafd Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_16/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_17/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_17/plot.png new file mode 100644 index 0000000..fa610be Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_17/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_18/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_18/plot.png new file mode 100644 index 0000000..f5f7da7 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_18/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_19/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_19/plot.png new file mode 100644 index 0000000..d44ac0c Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_19/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_2/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_2/plot.png new file mode 100644 index 0000000..c0eddb3 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_2/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_20/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_20/plot.png new file mode 100644 index 0000000..8a9f30b Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_20/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_21/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_21/plot.png new file mode 100644 index 0000000..d3b0f4c Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_21/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_22/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_22/plot.png new file mode 100644 index 0000000..060a8f0 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_22/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_23/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_23/plot.png new file mode 100644 index 0000000..7e4f76a Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_23/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_24/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_24/plot.png new file mode 100644 index 0000000..427e003 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_24/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_25/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_25/plot.png new file mode 100644 index 0000000..5fb1d28 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_25/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_26/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_26/plot.png new file mode 100644 index 0000000..5fb1d28 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_26/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_27/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_27/plot.png new file mode 100644 index 0000000..1c063a5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_27/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_28/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_28/plot.png new file mode 100644 index 0000000..1c063a5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_28/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_29/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_29/plot.png new file mode 100644 index 0000000..e2f8e62 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_29/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_3/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_3/plot.png new file mode 100644 index 0000000..5b39794 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_3/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_30/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_30/plot.png new file mode 100644 index 0000000..b1b3642 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_30/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_31/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_31/plot.png new file mode 100644 index 0000000..1a956d2 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_31/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_32/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_32/plot.png new file mode 100644 index 0000000..8028663 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_32/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_33/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_33/plot.png new file mode 100644 index 0000000..cfcf90a Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_33/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_34/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_34/plot.png new file mode 100644 index 0000000..be60a15 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_34/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_35/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_35/plot.png new file mode 100644 index 0000000..3850f7e Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_35/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_36/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_36/plot.png new file mode 100644 index 0000000..11ec836 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_36/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_37/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_37/plot.png new file mode 100644 index 0000000..5595ce2 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_37/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_38/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_38/plot.png new file mode 100644 index 0000000..e737506 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_38/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_39/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_39/plot.png new file mode 100644 index 0000000..8857b63 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_39/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_4/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_4/plot.png new file mode 100644 index 0000000..f0ed9c5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_4/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_40/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_40/plot.png new file mode 100644 index 0000000..2ce5ba8 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_40/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_41/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_41/plot.png new file mode 100644 index 0000000..c637444 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_41/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_42/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_42/plot.png new file mode 100644 index 0000000..20d9279 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_42/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_43/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_43/plot.png new file mode 100644 index 0000000..a264ac8 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_43/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_44/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_44/plot.png new file mode 100644 index 0000000..da4c65f Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_44/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_45/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_45/plot.png new file mode 100644 index 0000000..7c0d8f9 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_45/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_46/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_46/plot.png new file mode 100644 index 0000000..2e383ef Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_46/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_47/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_47/plot.png new file mode 100644 index 0000000..728fec1 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_47/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_48/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_48/plot.png new file mode 100644 index 0000000..6457c89 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_48/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_49/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_49/plot.png new file mode 100644 index 0000000..5ede070 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_49/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_5/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_5/plot.png new file mode 100644 index 0000000..f0ed9c5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_5/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_6/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_6/plot.png new file mode 100644 index 0000000..22bb720 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_6/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_7/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_7/plot.png new file mode 100644 index 0000000..e9d79c7 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_7/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_8/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_8/plot.png new file mode 100644 index 0000000..4e2c7e5 Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_8/plot.png differ diff --git a/examples/data/laser_inputs/thin_wall/Iteration_9/plot.png b/examples/data/laser_inputs/thin_wall/Iteration_9/plot.png new file mode 100644 index 0000000..55567de Binary files /dev/null and b/examples/data/laser_inputs/thin_wall/Iteration_9/plot.png differ diff --git a/fourier_generator.py b/fourier_generator.py new file mode 100644 index 0000000..0c7259c --- /dev/null +++ b/fourier_generator.py @@ -0,0 +1,73 @@ +import numpy as np +import matplotlib.pyplot as plt +import os + +class FourierSeriesGenerator: + + def __init__(self, total_time=400, time_step=0.002): + self.default_total_time = total_time + self.default_time_step = time_step + + @staticmethod + def _normalize(x): + return 2 * (x - np.min(x)) / (np.max(x) - np.min(x)) - 1 + + @staticmethod + def _rescale(x, min_value, max_value): + return x * (max_value - min_value) + min_value + + def fourier_series(self, x, params, rescale_mag=600, rescale_amplitude=50): + x = self._normalize(x) + + n, freq, amplitude, phase, trend, seasonality, = params + n = int(self._rescale(n, 0, 10)) + freq = self._rescale(freq, 0, 10) + amplitude = self._rescale(amplitude, 0, 10) + phase = self._rescale(phase, 0, 10000) + trend = self._rescale(trend, -500, 500) + seasonality = self._rescale(seasonality, 0, 200) + + sum = np.zeros_like(x) + for i in range(1, n + 1, 2): + term = (1 / i) * np.sin(2 * np.pi * freq * i * x + phase) + sum += term + + y = amplitude * (2 / np.pi) * sum + if np.sum(y) == 0: + return np.zeros_like(x) + 600 + else: + y = (y - np.min(y)) / (np.max(y) - np.min(y)) + y = (y * rescale_amplitude) + rescale_mag + + y += trend * x + y += seasonality * np.sin(2 * np.pi * x) + return y + + def plot_and_save(self, params, base_path, iteration, total_time=None, time_step=None): + if total_time is None: + total_time = self.default_total_time + if time_step is None: + time_step = self.default_time_step + + folder_name = f"Iteration_{iteration}" + save_directory = os.path.join(base_path, folder_name) + if not os.path.exists(save_directory): + os.makedirs(save_directory) # Create directory if it doesn't exist + + x = np.linspace(0, total_time, int(total_time / time_step)) + y = self.fourier_series(x, params) + + plt.plot(x, y, label=f'Curve') + plt.xlabel("Time") + plt.ylabel("Laser Power") + plt.legend() + image_path = os.path.join(save_directory, "plot.png") + plt.savefig(image_path) + plt.show() + + output_string = "laser_power,time_elapsed\n" + for i in range(len(x)): + output_string += f"{y[i]:.15f},{x[i]:.2f}\n" + csv_path = os.path.join(save_directory, "data.csv") + with open(csv_path, "w") as f: + f.write(output_string) \ No newline at end of file diff --git a/gamma_model_simulator.py b/gamma_model_simulator.py new file mode 100644 index 0000000..782ca7b --- /dev/null +++ b/gamma_model_simulator.py @@ -0,0 +1,37 @@ +# gamma_model_simulator.py + +import os +import numpy as np +import cupy as cp +import gamma.interface as rs +from multiprocessing import Process +import time + +class GammaModelSimulator: + def __init__(self, input_data_dir, sim_dir_name, laser_file, VtkOutputStep=1., ZarrOutputStep=0.02, outputVtkFiles=True, verbose=True): + self.input_data_dir = input_data_dir + self.sim_dir_name = sim_dir_name + self.laser_file = laser_file + self.VtkOutputStep = VtkOutputStep + self.ZarrOutputStep = ZarrOutputStep + self.outputVtkFiles = outputVtkFiles + self.verbose = verbose + + self.sim_itr = None + + def setup_simulation(self): + self.sim_itr = rs.FeaModel( + input_data_dir=self.input_data_dir, + geom_dir=self.sim_dir_name, + laserpowerfile=self.laser_file, + VtkOutputStep=self.VtkOutputStep, + ZarrOutputStep=self.ZarrOutputStep, + outputVtkFiles=self.outputVtkFiles, + verbose=self.verbose) + + def run_simulation(self): + if self.sim_itr: + self.sim_itr.run() + else: + raise ValueError("Simulation is not setup yet. Call setup_simulation() first.") + diff --git a/gamma_simulator_runner.py b/gamma_simulator_runner.py new file mode 100644 index 0000000..fb7e8a3 --- /dev/null +++ b/gamma_simulator_runner.py @@ -0,0 +1,25 @@ +from gamma_model_simulator import GammaModelSimulator + +class GammaSimulatorRunner: + def __init__(self, input_data_dir, sim_dir_name, laser_file): + self.simulator = GammaModelSimulator( + input_data_dir=input_data_dir, + sim_dir_name=sim_dir_name, + laser_file=laser_file + ) + + def run(self): + # Set up the simulation + self.simulator.setup_simulation() + + # Execute the simulation + self.simulator.run_simulation() + +if __name__ == "__main__": + # Define your parameters + INPUT_DATA_DIR = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data" + SIM_DIR_NAME = "thin_wall" + LASER_FILE = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall/LP_2" + + runner = GammaSimulatorRunner(INPUT_DATA_DIR, SIM_DIR_NAME, LASER_FILE) + runner.run() diff --git a/laser_power_data.xlsx b/laser_power_data.xlsx new file mode 100644 index 0000000..b3f70d9 Binary files /dev/null and b/laser_power_data.xlsx differ diff --git a/optimized_params.xlsx b/optimized_params.xlsx new file mode 100644 index 0000000..768ac4f Binary files /dev/null and b/optimized_params.xlsx differ diff --git a/run_analysis.py b/run_analysis.py new file mode 100644 index 0000000..246c181 --- /dev/null +++ b/run_analysis.py @@ -0,0 +1,127 @@ +import numpy as np +import pandas as pd +import zarr +from botorch.fit import fit_gpytorch_model +import torch +from botorch.models import SingleTaskGP +from gpytorch.mlls import ExactMarginalLogLikelihood +from botorch.optim import optimize_acqf +from botorch.acquisition import UpperConfidenceBound +from tqdm import tqdm +import pandas as pd +import numpy as np +import os +import warnings +warnings.filterwarnings("ignore") + +# Define the neural network parameters in the following function: +def objective(params, iteration_number, min_temp=893, max_temp=993): + from fourier_generator import FourierSeriesGenerator + from temperature_analyzer import TemperatureAnalyzer + + + # Generate and save the Fourier series + generator = FourierSeriesGenerator() + base_path = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall" + generator.plot_and_save(params, base_path, iteration_number, total_time=300, time_step=0.002) + + # Paths for the simulator + INPUT_DATA_DIR = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data" + SIM_DIR_NAME = "thin_wall" + + # Modify LASER_FILE to reflect the correct iteration and CSV filename + LASER_FILE = os.path.join(base_path, f"Iteration_{iteration_number}", "data") + + # Modify ZARR_LOCATION to reflect the correct iteration + ZARR_LOCATION = os.path.join(base_path, f"Iteration_{iteration_number}", "data.zarr", "ff_dt_temperature") + + selected_nodes_list = ["45003"] # As an example + + analyzer = TemperatureAnalyzer( + INPUT_DATA_DIR, + SIM_DIR_NAME, + LASER_FILE + ) + + # Call function + avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True) + return torch.tensor(avg_time) # Now returns a 1D tensor + + + +# Bayesian Optimization functions +# ----------------------------------------------------------- +def initialize_model(): + train_X = pd.read_excel("optimized_params.xlsx") + train_X_np = train_X[["n", "freq", "amplitude", "phase", "trend", "seasonality"]].values + train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) + train_Y = pd.read_excel("avg_heat_treatment_times.xlsx") + train_Y_np = train_Y[["Average Heat Treatment Time"]].values + train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) + gp = SingleTaskGP(train_X_torch.float(), train_Y_torch.float()) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + return gp + +def optimize(bounds, n_steps=50): + gp = initialize_model() + best_value = -float('inf') + best_params = None + + param_history = [] + value_history = [] + uncertainty_history = [] + + # Create an empty dataframe with the required columns + df = pd.DataFrame(columns=['Parameters', 'Objective Value', 'Uncertainty']) + + for i in tqdm(range(n_steps)): + UCB = UpperConfidenceBound(gp, beta=0.5) + candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20) + candidate_numpy = candidate.detach().numpy().flatten() + new_Y = objective(candidate_numpy, iteration_number=i).unsqueeze(0).unsqueeze(-1) + + variance = gp.posterior(candidate).variance + uncertainty_history.append(variance.item()) + + print(new_Y) + print(candidate_numpy) + + + if new_Y.item() > best_value: + best_value = new_Y.item() + best_params = candidate_numpy + + param_history.append(candidate_numpy) + value_history.append(new_Y.item()) + + # Update the Gaussian Process model + gp = SingleTaskGP( + torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy.astype(np.float32)).unsqueeze(0)]), + torch.cat([gp.train_targets.unsqueeze(-1).float(), new_Y.float()], dim=0) + ) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + + # Save the current iteration results to the dataframe + df = df.append({ + 'Current Best Parameters': best_params, + 'Current Best Value': best_value, + 'Parameters': candidate_numpy.tolist(), + 'Objective Value': new_Y.item(), + 'Uncertainty': variance.item() + }, ignore_index=True) + + # Save the dataframe to an Excel file + df.to_csv('bayesian_optimization_results.csv', index=False) + + return gp, best_params, best_value, param_history, value_history, uncertainty_history +# ----------------------------------------------------------- + +if __name__ == "__main__": + input_size = 6 # Assuming 6 parameters + bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.float32) + optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(bounds) + + print(f'Best parameters: {best_params}, Best value: {best_value}') + print('Uncertainty at each step:', uncertainty_history) diff --git a/run_analysis_delete_previous.py b/run_analysis_delete_previous.py new file mode 100644 index 0000000..b7a5609 --- /dev/null +++ b/run_analysis_delete_previous.py @@ -0,0 +1,150 @@ +import numpy as np +import pandas as pd +import zarr +from botorch.fit import fit_gpytorch_model +import torch +from botorch.models import SingleTaskGP +from gpytorch.mlls import ExactMarginalLogLikelihood +from botorch.optim import optimize_acqf +from botorch.acquisition import UpperConfidenceBound +from tqdm import tqdm +import pandas as pd +import numpy as np +import os +import warnings +import shutil + +warnings.filterwarnings("ignore") + + +# This function deletes a directory and all its contents +def delete_directory(dir_path): + if os.path.exists(dir_path): + shutil.rmtree(dir_path) + print(f"Deleted: {dir_path}") + else: + print(f"The directory {dir_path} does not exist") + +# Define the neural network parameters in the following function: +def objective(params, iteration_number, min_temp=893, max_temp=993): + from fourier_generator import FourierSeriesGenerator + from temperature_analyzer import TemperatureAnalyzer + + + # Generate and save the Fourier series + generator = FourierSeriesGenerator() + base_path = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall" + generator.plot_and_save(params, base_path, iteration_number, total_time=300, time_step=0.002) + + # Paths for the simulator + INPUT_DATA_DIR = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data" + SIM_DIR_NAME = "thin_wall" + + # Modify LASER_FILE to reflect the correct iteration and CSV filename + LASER_FILE = os.path.join(base_path, f"Iteration_{iteration_number}", "data") + + # Modify ZARR_LOCATION to reflect the correct iteration + ZARR_LOCATION = os.path.join(base_path, f"Iteration_{iteration_number}", "data.zarr", "ff_dt_temperature") + + selected_nodes_list = ["45003"] # As an example + + analyzer = TemperatureAnalyzer( + INPUT_DATA_DIR, + SIM_DIR_NAME, + LASER_FILE + ) + + # Call function + avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True) + return torch.tensor(avg_time) # Now returns a 1D tensor + + + +# Bayesian Optimization functions +# ----------------------------------------------------------- +def initialize_model(): + train_X = pd.read_excel("optimized_params.xlsx") + train_X_np = train_X[["n", "freq", "amplitude", "phase", "trend", "seasonality"]].values + train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) + train_Y = pd.read_excel("avg_heat_treatment_times.xlsx") + train_Y_np = train_Y[["Average Heat Treatment Time"]].values + train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) + gp = SingleTaskGP(train_X_torch.float(), train_Y_torch.float()) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + return gp + +def optimize(bounds, n_steps=50): + gp = initialize_model() + best_value = -float('inf') + best_params = None + + param_history = [] + value_history = [] + uncertainty_history = [] + + # Create an empty dataframe with the required columns + df = pd.DataFrame(columns=['Parameters', 'Objective Value', 'Uncertainty']) + + for i in tqdm(range(n_steps)): + if i > 0: + delete_dir_path = os.path.join( + "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall", + f"Iteration_{i-1}","data" + ) + delete_directory(delete_dir_path) + if i > 0: + delete_dir_path = os.path.join( + "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall", + f"Iteration_{i-1}","data.zarr" + ) + delete_directory(delete_dir_path) + UCB = UpperConfidenceBound(gp, beta=0.5) + candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20) + candidate_numpy = candidate.detach().numpy().flatten() + new_Y = objective(candidate_numpy, iteration_number=i).unsqueeze(0).unsqueeze(-1) + + variance = gp.posterior(candidate).variance + uncertainty_history.append(variance.item()) + + print(new_Y) + print(candidate_numpy) + + + if new_Y.item() > best_value: + best_value = new_Y.item() + best_params = candidate_numpy + + param_history.append(candidate_numpy) + value_history.append(new_Y.item()) + + # Update the Gaussian Process model + gp = SingleTaskGP( + torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy.astype(np.float32)).unsqueeze(0)]), + torch.cat([gp.train_targets.unsqueeze(-1).float(), new_Y.float()], dim=0) + ) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + + # Save the current iteration results to the dataframe + df = df.append({ + 'Current Best Parameters': best_params, + 'Current Best Value': best_value, + 'Parameters': candidate_numpy.tolist(), + 'Objective Value': new_Y.item(), + 'Uncertainty': variance.item() + }, ignore_index=True) + + # Save the dataframe to an Excel file + df.to_csv('bayesian_optimization_results.csv', index=False) + + return gp, best_params, best_value, param_history, value_history, uncertainty_history +# ----------------------------------------------------------- + +if __name__ == "__main__": + input_size = 6 # Assuming 6 parameters + bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.float32) + optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(bounds) + + print(f'Best parameters: {best_params}, Best value: {best_value}') + print('Uncertainty at each step:', uncertainty_history) diff --git a/run_analysis_delete_previous_adaptive.py b/run_analysis_delete_previous_adaptive.py new file mode 100644 index 0000000..46bf299 --- /dev/null +++ b/run_analysis_delete_previous_adaptive.py @@ -0,0 +1,167 @@ +import numpy as np +import pandas as pd +import zarr +from botorch.fit import fit_gpytorch_model +import torch +from botorch.models import SingleTaskGP +from gpytorch.mlls import ExactMarginalLogLikelihood +from botorch.optim import optimize_acqf +from botorch.acquisition import UpperConfidenceBound +from tqdm import tqdm +import pandas as pd +import numpy as np +import os +import warnings +import shutil + +warnings.filterwarnings("ignore") + + +# This function deletes a directory and all its contents +def delete_directory(dir_path): + if os.path.exists(dir_path): + shutil.rmtree(dir_path) + print(f"Deleted: {dir_path}") + else: + print(f"The directory {dir_path} does not exist") + +# Define the neural network parameters in the following function: +def objective(params, iteration_number, min_temp=893, max_temp=993): + from fourier_generator import FourierSeriesGenerator + from temperature_analyzer import TemperatureAnalyzer + + + # Generate and save the Fourier series + generator = FourierSeriesGenerator() + base_path = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall" + generator.plot_and_save(params, base_path, iteration_number, total_time=300, time_step=0.002) + + # Paths for the simulator + INPUT_DATA_DIR = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data" + SIM_DIR_NAME = "thin_wall" + + # Modify LASER_FILE to reflect the correct iteration and CSV filename + LASER_FILE = os.path.join(base_path, f"Iteration_{iteration_number}", "data") + + # Modify ZARR_LOCATION to reflect the correct iteration + ZARR_LOCATION = os.path.join(base_path, f"Iteration_{iteration_number}", "data.zarr", "ff_dt_temperature") + + selected_nodes_list = ["45003"] # As an example + + analyzer = TemperatureAnalyzer( + INPUT_DATA_DIR, + SIM_DIR_NAME, + LASER_FILE + ) + + # Call function + avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True) + return torch.tensor(avg_time) # Now returns a 1D tensor + + + +# Bayesian Optimization functions +# ----------------------------------------------------------- +def initialize_model(): + train_X = pd.read_excel("optimized_params.xlsx") + train_X_np = train_X[["n", "freq", "amplitude", "phase", "trend", "seasonality"]].values + train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) + train_Y = pd.read_excel("avg_heat_treatment_times.xlsx") + train_Y_np = train_Y[["Average Heat Treatment Time"]].values + train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) + gp = SingleTaskGP(train_X_torch.float(), train_Y_torch.float()) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + return gp + +# Function to compute adaptive beta +def adaptive_beta(i, uncertainties, k=2.0, uncertainty_factor=0.5): + # Use inverse square root decay for beta + beta_base = k / np.sqrt(i + 1) + + # Adjust beta based on recent uncertainty + if uncertainties: + recent_uncertainty = np.mean(uncertainties[-5:]) # average over last 5 steps + beta_adjusted = beta_base * (1 + uncertainty_factor * recent_uncertainty) + else: + beta_adjusted = beta_base + + return beta_adjusted + + +def optimize(bounds, n_steps=50): + gp = initialize_model() + best_value = -float('inf') + best_params = None + + param_history = [] + value_history = [] + uncertainty_history = [] + + # Create an empty dataframe with the required columns + df = pd.DataFrame(columns=['Parameters', 'Objective Value', 'Uncertainty']) + + for i in tqdm(range(n_steps)): + if i > 0: + delete_dir_path = os.path.join( + "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall", + f"Iteration_{i-1}","data" + ) + delete_directory(delete_dir_path) + if i > 0: + delete_dir_path = os.path.join( + "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall", + f"Iteration_{i-1}","data.zarr" + ) + delete_directory(delete_dir_path) + # Dynamic beta based on iteration number and uncertainty + beta = adaptive_beta(i, uncertainty_history) + UCB = UpperConfidenceBound(gp, beta=beta) + candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20) + candidate_numpy = candidate.detach().numpy().flatten() + new_Y = objective(candidate_numpy, iteration_number=i).unsqueeze(0).unsqueeze(-1) + + variance = gp.posterior(candidate).variance + uncertainty_history.append(variance.item()) + + print(new_Y) + print(candidate_numpy) + + + if new_Y.item() > best_value: + best_value = new_Y.item() + best_params = candidate_numpy + + param_history.append(candidate_numpy) + value_history.append(new_Y.item()) + + # Update the Gaussian Process model + gp = SingleTaskGP( + torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy.astype(np.float32)).unsqueeze(0)]), + torch.cat([gp.train_targets.unsqueeze(-1).float(), new_Y.float()], dim=0) + ) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + + # Save the current iteration results to the dataframe + df = df.append({ + 'Current Best Parameters': best_params, + 'Current Best Value': best_value, + 'Parameters': candidate_numpy.tolist(), + 'Objective Value': new_Y.item(), + 'Uncertainty': variance.item() + }, ignore_index=True) + + # Save the dataframe to an Excel file + df.to_csv('bayesian_optimization_results.csv', index=False) + + return gp, best_params, best_value, param_history, value_history, uncertainty_history +# ----------------------------------------------------------- + +if __name__ == "__main__": + input_size = 6 # Assuming 6 parameters + bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.float32) + optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(bounds) + + print(f'Best parameters: {best_params}, Best value: {best_value}') + print('Uncertainty at each step:', uncertainty_history) diff --git a/run_analysis_onedrive_upload.py b/run_analysis_onedrive_upload.py new file mode 100644 index 0000000..5aa882f --- /dev/null +++ b/run_analysis_onedrive_upload.py @@ -0,0 +1,127 @@ +import numpy as np +import pandas as pd +import zarr +from botorch.fit import fit_gpytorch_model +import torch +from botorch.models import SingleTaskGP +from gpytorch.mlls import ExactMarginalLogLikelihood +from botorch.optim import optimize_acqf +from botorch.acquisition import UpperConfidenceBound +from tqdm import tqdm +import pandas as pd +import numpy as np +import os +import warnings +warnings.filterwarnings("ignore") + +# Define the neural network parameters in the following function: +def objective(params, iteration_number, min_temp=893, max_temp=993): + from fourier_generator import FourierSeriesGenerator + from temperature_analyzer import TemperatureAnalyzer + + + # Generate and save the Fourier series + generator = FourierSeriesGenerator() + base_path = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data/laser_inputs/thin_wall" + generator.plot_and_save(params, base_path, iteration_number, total_time=3, time_step=0.002) + + # Paths for the simulator + INPUT_DATA_DIR = "/home/vnk3019/ded_dt_thermomechanical_solver/examples/data" + SIM_DIR_NAME = "thin_wall" + + # Modify LASER_FILE to reflect the correct iteration and CSV filename + LASER_FILE = os.path.join(base_path, f"Iteration_{iteration_number}", "data") + + # Modify ZARR_LOCATION to reflect the correct iteration + ZARR_LOCATION = os.path.join(base_path, f"Iteration_{iteration_number}", "data.zarr", "ff_dt_temperature") + + selected_nodes_list = ["45003"] # As an example + + analyzer = TemperatureAnalyzer( + INPUT_DATA_DIR, + SIM_DIR_NAME, + LASER_FILE + ) + + # Call function + avg_time = analyzer.run_simulation_and_analyze(ZARR_LOCATION, min_temp, max_temp, selected_nodes_list, plot_graph=True) + return torch.tensor(avg_time) # Now returns a 1D tensor + + + +# Bayesian Optimization functions +# ----------------------------------------------------------- +def initialize_model(): + train_X = pd.read_excel("optimized_params.xlsx") + train_X_np = train_X[["n", "freq", "amplitude", "phase", "trend", "seasonality"]].values + train_X_torch = torch.tensor(train_X_np, dtype=torch.float32) + train_Y = pd.read_excel("avg_heat_treatment_times.xlsx") + train_Y_np = train_Y[["Average Heat Treatment Time"]].values + train_Y_torch = torch.tensor(train_Y_np, dtype=torch.float32) + gp = SingleTaskGP(train_X_torch.float(), train_Y_torch.float()) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + return gp + +def optimize(bounds, n_steps=50): + gp = initialize_model() + best_value = -float('inf') + best_params = None + + param_history = [] + value_history = [] + uncertainty_history = [] + + # Create an empty dataframe with the required columns + df = pd.DataFrame(columns=['Parameters', 'Objective Value', 'Uncertainty']) + + for i in tqdm(range(n_steps)): + UCB = UpperConfidenceBound(gp, beta=0.5) + candidate, _ = optimize_acqf(UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20) + candidate_numpy = candidate.detach().numpy().flatten() + new_Y = objective(candidate_numpy, iteration_number=i).unsqueeze(0).unsqueeze(-1) + + variance = gp.posterior(candidate).variance + uncertainty_history.append(variance.item()) + + print(new_Y) + print(candidate_numpy) + + + if new_Y.item() > best_value: + best_value = new_Y.item() + best_params = candidate_numpy + + param_history.append(candidate_numpy) + value_history.append(new_Y.item()) + + # Update the Gaussian Process model + gp = SingleTaskGP( + torch.cat([gp.train_inputs[0], torch.tensor(candidate_numpy.astype(np.float32)).unsqueeze(0)]), + torch.cat([gp.train_targets.unsqueeze(-1).float(), new_Y.float()], dim=0) + ) + mll = ExactMarginalLogLikelihood(gp.likelihood, gp) + fit_gpytorch_model(mll) + + # Save the current iteration results to the dataframe + df = df.append({ + 'Current Best Parameters': best_params, + 'Current Best Value': best_value, + 'Parameters': candidate_numpy.tolist(), + 'Objective Value': new_Y.item(), + 'Uncertainty': variance.item() + }, ignore_index=True) + + # Save the dataframe to an Excel file + df.to_csv('bayesian_optimization_results.csv', index=False) + + return gp, best_params, best_value, param_history, value_history, uncertainty_history +# ----------------------------------------------------------- + +if __name__ == "__main__": + input_size = 6 # Assuming 6 parameters + bounds = torch.tensor([[0]*input_size, [1]*input_size], dtype=torch.float32) + optimized_model, best_params, best_value, param_history, value_history, uncertainty_history = optimize(bounds) + + print(f'Best parameters: {best_params}, Best value: {best_value}') + print('Uncertainty at each step:', uncertainty_history) diff --git a/src/gamma/interface.py b/src/gamma/interface.py index 8b40093..2b270bf 100644 --- a/src/gamma/interface.py +++ b/src/gamma/interface.py @@ -2,6 +2,7 @@ import subprocess import time import warnings + import cupy as cp import numpy as np import pandas as pd @@ -11,6 +12,7 @@ from gamma.simulator.gamma import domain_mgr, heat_solve_mgr + class FeaModel(): ''' This class manages the FEA simulation. Use this as the primary interface to the simulation. ''' @@ -23,6 +25,9 @@ def __init__(self, input_data_dir, geom_dir, laserpowerfile, timestep_override=- # output self.verbose = verbose + # laserpowerfile: profile of laser power w.r.t time + self.laserpowerfile = laserpowerfile + # geom_dir: directory containing .k input file and toolpath.crs file self.geom_dir = geom_dir @@ -34,29 +39,28 @@ def __init__(self, input_data_dir, geom_dir, laserpowerfile, timestep_override=- self.domain = domain_mgr(input_data_dir=input_data_dir, filename=self.geometry_file, toolpathdir=self.toolpath_file, verbose=self.verbose, timestep_override=timestep_override) self.heat_solver = heat_solve_mgr(self.domain) - # def_max_itr: time for original simulation to run to completion - self.def_max_itr = int(self.domain.end_sim_time/self.domain.dt) - - # laserpowerfile: profile of laser power w.r.t time - self.laserpowerfile = laserpowerfile - if self.laserpowerfile != None: - # Read laser power input and timestep-sync file - inp = pd.read_csv(os.path.join(input_data_dir, "laser_inputs", self.geom_dir, self.laserpowerfile) + ".csv").to_numpy() - self.laser_power_seq = inp[:, 0] - self.timesteps = inp[:, 1] - self.las_max_itr = len(self.timesteps) - else: - self.laser_power_seq = None - self.las_max_itr = np.inf + # Read laser power input and timestep-sync file + inp = pd.read_csv(os.path.join(input_data_dir, "laser_inputs", self.geom_dir, self.laserpowerfile) + ".csv").to_numpy() + self.laser_power_seq = inp[:, 0] + self.timesteps = inp[:, 1] + self.las_max_itr = len(self.timesteps) # las_max_itr: length of laser input signal + # def_max_itr: time for original simulation to run to completion + self.def_max_itr = int(self.domain.end_sim_time/self.domain.dt) self.max_itr = min(self.las_max_itr, self.def_max_itr) - # VTK output steps + # VTK output_times: vector containing expected times at which a vtk file is outputted. self.VtkOutputStep = VtkOutputStep # Time step between iterations + self.VtkOutputTimes = np.linspace(0, self.VtkOutputStep*self.max_itr, self.max_itr+1) + self.VtkOutputTimes = [x for x in self.VtkOutputTimes if x <= self.domain.end_sim_time] - # Zarr output steps + # Zarr output steps: vector containing expected times at which a zarr file is generated self.ZarrOutputStep = ZarrOutputStep + self.ZarrOutputTimes = np.linspace(0, self.ZarrOutputStep*self.max_itr, self.max_itr+1) + self.ZarrOutputTimes = [x for x in self.ZarrOutputTimes if x <= self.domain.end_sim_time] + exp_zarr_len = len(self.ZarrOutputTimes) + ### Initialization of outputs # Start datarecorder object to save pointwise data @@ -64,16 +68,16 @@ def __init__(self, input_data_dir, geom_dir, laserpowerfile, timestep_override=- self.zarr_stream = AuxDataRecorder(nnodes=self.domain.nodes.shape[0], outputFolderPath=(os.path.join("./zarr_output", self.geom_dir, - self.laserpowerfile) +"_aux.zarr") - ) + self.laserpowerfile) +"_aux.zarr"), + ExpOutputSteps=exp_zarr_len) else: self.zarr_stream = DataRecorder(nnodes=self.domain.nodes.shape[0], nele=self.domain.elements.shape[0], outputFolderPath=(os.path.join("./zarr_output", self.geom_dir, - self.laserpowerfile) +".zarr") - ) + self.laserpowerfile) +".zarr"), + ExpOutputSteps=exp_zarr_len) # Record nodes and nodal locations self.zarr_stream.nodelocs = self.domain.nodes @@ -102,71 +106,63 @@ def run(self): self.tic_start = time.perf_counter() self.tic_jtr = self.tic_start - self.active_nodes_previous = self.domain.active_nodes.astype('i1') + active_nodes_previous = self.domain.active_nodes.astype('i1') while self.domain.current_sim_time < self.domain.end_sim_time - 1e-8 and self.heat_solver.current_step < self.max_itr : - self.step() - - def step(self, laser_power=None): - ''' Run a single step of the simulation. ''' - - # Load the current step of the laser profile, and multiply by the absortivity - if laser_power == None: - if self.laserpowerfile == None: - raise ValueError("No laser power input provided to the step function, and no laser power file provided to the model constructor.") - self.heat_solver.q_in = self.laser_power_seq[self.heat_solver.current_step] * self.domain.absortivity - else: - self.heat_solver.q_in = laser_power * self.domain.absortivity - - # Check that the time steps agree - if np.abs(self.domain.current_sim_time - self.timesteps[self.heat_solver.current_step]) / self.domain.dt > 0.01: - # Check if the current domain is correct - # In the future, probably best to just check this once at the beginning instead of every iteration - warnings.warn("Warning! Time steps of LP input are not well aligned with simulation steps") - - # Run the solver - self.heat_solver.time_integration() - - # Save timestamped zarr file at specified rate - if self.heat_solver.current_step % self.ZarrOutputStep == 0: - - # Free unused memory blocks - mempool = cp.get_default_memory_pool() - mempool.free_all_blocks() - - # Get active nodes. - active_nodes = self.domain.active_nodes.astype('i1') - - # Save output file - self.ZarrFileNum = self.ZarrFileNum + 1 - self.RecordTempsZarr(active_nodes, self.active_nodes_previous) - self.active_nodes_previous = active_nodes - - # save .vtk file at specified rate - if self.heat_solver.current_step % self.VtkOutputStep == 0: - # Print time and completion status to terminal - self.toc_jtr = time.perf_counter() - self.elapsed_wall_time = self.toc_jtr - self.tic_start - self.percent_complete = self.domain.current_sim_time/self.domain.end_sim_time - self.time_remaining = (self.elapsed_wall_time/self.domain.current_sim_time)*(self.domain.end_sim_time - self.domain.current_sim_time) - if self.verbose: - print("Simulation time: {:0.2} s, Percentage done: {:0.3}%, Elapsed Time: {:0.3} s".format( - self.domain.current_sim_time, 100.*self.domain.current_sim_time/self.domain.end_sim_time, self.elapsed_wall_time)) - self.stats_append = np.expand_dims(np.array([self.elapsed_wall_time, self.domain.current_sim_time, self.percent_complete, self.time_remaining]), axis=0) - with open('debug.csv', 'a') as exportfile: - np.savetxt(exportfile, self.stats_append, delimiter=',') - - # vtk file filename and save - if self.outputVtkFiles: - filename = os.path.join('vtk_files', self.geom_dir, self.laserpowerfile, 'u{:05d}.vtk'.format(self.VtkFileNum)) - self.save_vtk(filename) - - # iterate file number - self.VtkFileNum = self.VtkFileNum + 1 - self.output_time = self.domain.current_sim_time + # Load the current step of the laser profile, and multiply by the absortivity + self.heat_solver.q_in = self.laser_power_seq[self.heat_solver.current_step]*self.domain.absortivity + + # Check that the time steps agree + if np.abs(self.domain.current_sim_time - self.timesteps[self.heat_solver.current_step]) / self.domain.dt > 0.01: + # Check if the current domain is correct + # In the future, probably best to just check this once at the beginning instead of every iteration + warnings.warn("Warning! Time steps of LP input are not well aligned with simulation steps") + + # Run the solver + self.heat_solver.time_integration() + # Save timestamped zarr file + if self.domain.current_sim_time >= (self.ZarrOutputTimes[self.ZarrFileNum] - (self.domain.dt/10)): + + # Free unused memory blocks + mempool = cp.get_default_memory_pool() + mempool.free_all_blocks() + + # Get active nodes. + active_nodes = self.domain.active_nodes.astype('i1') + # Save output file + self.ZarrFileNum = self.ZarrFileNum + 1 + self.RecordTempsZarr(active_nodes, active_nodes_previous) + active_nodes_previous = active_nodes + + # save .vtk file if the current time is greater than an expected output time + # offset time by dt/10 due to floating point error + # honestly this whole thing should really be done with integers + if self.domain.current_sim_time >= (self.VtkOutputTimes[self.VtkFileNum] - (self.domain.dt/10)): + # Print time and completion status to terminal + self.toc_jtr = time.perf_counter() + self.elapsed_wall_time = self.toc_jtr - self.tic_start + self.percent_complete = self.domain.current_sim_time/self.domain.end_sim_time + self.time_remaining = (self.elapsed_wall_time/self.domain.current_sim_time)*(self.domain.end_sim_time - self.domain.current_sim_time) + if self.verbose: + print("Simulation time: {:0.2} s, Percentage done: {:0.3}%, Elapsed Time: {:0.3} s".format( + self.domain.current_sim_time, 100.*self.domain.current_sim_time/self.domain.end_sim_time, self.elapsed_wall_time)) + self.stats_append = np.expand_dims(np.array([self.elapsed_wall_time, self.domain.current_sim_time, self.percent_complete, self.time_remaining]), axis=0) + with open('debug.csv', 'a') as exportfile: + np.savetxt(exportfile, self.stats_append, delimiter=',') + + # vtk file filename and save + if self.outputVtkFiles: + filename = os.path.join('vtk_files', self.geom_dir, self.laserpowerfile, 'u{:05d}.vtk'.format(self.VtkFileNum)) + self.save_vtk(filename) + + # iterate file number + self.VtkFileNum = self.VtkFileNum + 1 + self.output_time = self.domain.current_sim_time + + def calc_geom_params(self): ''' Calculate surface distances. ''' @@ -181,12 +177,9 @@ def calc_geom_params(self): # Don't run the solver - instead, just move the laser self.heat_solver.update_field_no_integration() - # Determine which files to save. - saveZarr = self.heat_solver.current_step % self.ZarrOutputStep == 0 - saveVtk = self.heat_solver.current_step % self.VtkOutputStep == 0 + # Save timestamped zarr file + if self.domain.current_sim_time >= (self.ZarrOutputTimes[self.ZarrFileNum] - (self.domain.dt/10)): - # Calculate distances. - if saveZarr or saveVtk: # Find closest surfaces self.nodal_surf_distance = self.heat_solver.find_closest_surf_dist() # Free unused memory blocks @@ -195,9 +188,7 @@ def calc_geom_params(self): # Find laser distance self.nodal_laser_distance = self.heat_solver.find_laser_dist() - - # Save timestamped zarr file - if saveZarr: + # Save output file self.ZarrFileNum = self.ZarrFileNum + 1 self.RecordAuxZarr() @@ -205,7 +196,7 @@ def calc_geom_params(self): # save .vtk file if the current time is greater than an expected output time # offset time by dt/10 due to floating point error # honestly this whole thing should really be done with integers - if saveVtk: + if self.domain.current_sim_time >= (self.VtkOutputTimes[self.VtkFileNum] - (self.domain.dt/10)): # Print time and completion status to terminal self.toc_jtr = time.perf_counter() self.elapsed_wall_time = self.toc_jtr - self.tic_start @@ -261,33 +252,32 @@ def OneDriveUpload(self, rclone_stream, destination, BashLoc): subprocess.Popen(TarZarrCmd + " && " + DelZarrOrigCmd + " && " + UploadZarrTarCmd + " && "+ DelZarrTarCmd, shell=True, executable=BashLoc) # Run commands to upload vtk to drive - subprocess.Popen(TarVTKCmd + " && " + DelVTKOrigCmd + " && " + UploadVTKTarCmd + " && " + DelVTKTarCmd, shell=True, executable=BashLoc) - + def RecordTempsZarr(self, active_nodes, active_nodes_prev, outputmode="structured"): '''Records a single data point to a zarr file''' - timestep = np.expand_dims(np.expand_dims(self.domain.current_sim_time, axis=0), axis=1) - pos_x = np.expand_dims(np.expand_dims(self.heat_solver.laser_loc[0].get(), axis=0), axis=1) - pos_y = np.expand_dims(np.expand_dims(self.heat_solver.laser_loc[1].get(), axis=0), axis=1) - pos_z = np.expand_dims(np.expand_dims(self.heat_solver.laser_loc[2].get(), axis=0), axis=1) - laser_power = np.expand_dims(np.expand_dims(self.heat_solver.q_in, axis=0), axis=1) - ff_temperature = np.expand_dims(self.heat_solver.temperature.get(), axis=0) - active_elements = np.expand_dims(self.domain.active_elements.astype('i1'), axis=0) + timestep = np.expand_dims(self.domain.current_sim_time, axis=0) + pos_x = np.expand_dims(self.heat_solver.laser_loc[0].get(), axis=0) + pos_y = np.expand_dims(self.heat_solver.laser_loc[1].get(), axis=0) + pos_z = np.expand_dims(self.heat_solver.laser_loc[2].get(), axis=0) + laser_power = np.expand_dims(self.heat_solver.q_in, axis=0) + ff_temperature = self.heat_solver.temperature.get() + active_elements = self.domain.active_elements.astype('i1') activated_nodes = np.where(active_nodes != active_nodes_prev)[0] if outputmode == "structured": # For each of the data streams, append the data for the current time step # expanding dimensions as needed to match - self.zarr_stream.streamobj["timestamp"].append(timestep, axis=0) - self.zarr_stream.streamobj["dt_pos_x"].append(pos_x, axis=0) - self.zarr_stream.streamobj["dt_pos_y"].append(pos_y, axis=0) - self.zarr_stream.streamobj["dt_pos_z"].append(pos_z, axis=0) - self.zarr_stream.streamobj["dt_laser_power"].append(laser_power, axis=0) - self.zarr_stream.streamobj["ff_dt_active_nodes"].append(np.expand_dims(active_nodes, axis=0), axis=0) - self.zarr_stream.streamobj["ff_dt_temperature"].append(ff_temperature, axis=0) - self.zarr_stream.streamobj["ff_dt_active_elements"].append(active_elements, axis=0) - self.zarr_stream.streamobj["ff_laser_power_birth"].oindex[activated_nodes] = laser_power[0][0] + self.zarr_stream.streamobj["timestamp"][self.ZarrFileNum] = timestep + self.zarr_stream.streamobj["dt_pos_x"][self.ZarrFileNum] = pos_x + self.zarr_stream.streamobj["dt_pos_y"][self.ZarrFileNum] = pos_y + self.zarr_stream.streamobj["dt_pos_z"][self.ZarrFileNum] = pos_z + self.zarr_stream.streamobj["dt_laser_power"][self.ZarrFileNum] = laser_power + self.zarr_stream.streamobj["ff_dt_active_nodes"][self.ZarrFileNum] = active_nodes + self.zarr_stream.streamobj["ff_dt_temperature"][self.ZarrFileNum] = ff_temperature + self.zarr_stream.streamobj["ff_dt_active_elements"][self.ZarrFileNum] = active_elements + self.zarr_stream.streamobj["ff_laser_power_birth"].oindex[activated_nodes] = laser_power[0] elif outputmode == "bulked": new_row = np.zeros([1, (5+self.domain.nodes.shape[0])]) @@ -308,6 +298,7 @@ def RecordAuxZarr(self): timestep = np.expand_dims(self.domain.current_sim_time, axis=0) laser_dist = self.nodal_laser_distance surf_dist = self.nodal_surf_distance + self.zarr_stream.streamobj["timestamp"][self.ZarrFileNum] = timestep self.zarr_stream.streamobj["ff_dt_dist_node_laser"][self.ZarrFileNum] = laser_dist self.zarr_stream.streamobj["ff_dt_dist_node_boundary"][self.ZarrFileNum] = surf_dist @@ -344,6 +335,7 @@ def save_dist_vtk(self, filename): class AuxDataRecorder(): def __init__(self, nnodes, + ExpOutputSteps, outputFolderPath ): @@ -380,7 +372,7 @@ def __init__(self, overwrite=True) else: self.streamobj[stream] = self.out_root.create_dataset(stream, - shape=(1, self.dimsdict[stream]), + shape=(ExpOutputSteps+1, self.dimsdict[stream]), chunks=(1, self.dimsdict[stream]), dtype=self.typedict[stream], compressor=None, @@ -390,6 +382,7 @@ class DataRecorder(): def __init__(self, nnodes, nele, + ExpOutputSteps, outputFolderPath, outputmode = "structured" ): @@ -440,7 +433,7 @@ def __init__(self, overwrite=True) else: self.streamobj[stream] = self.out_root.create_dataset(stream, - shape=(1, self.dimsdict[stream]), + shape=(ExpOutputSteps+1, self.dimsdict[stream]), chunks=(1, self.dimsdict[stream]), dtype=self.typedict[stream], compressor=None, diff --git a/src/gamma/simulator/practice_run.ipynb b/src/gamma/simulator/practice_run.ipynb new file mode 100644 index 0000000..e69de29 diff --git a/temperature_analyzer.py b/temperature_analyzer.py new file mode 100644 index 0000000..35002e7 --- /dev/null +++ b/temperature_analyzer.py @@ -0,0 +1,82 @@ +import matplotlib.pyplot as plt +import numpy as np +import zarr +import pandas as pd +from tqdm import tqdm +from gamma_model_simulator import GammaModelSimulator +import os + +class TemperatureAnalyzer: + + def __init__(self, input_data_dir, sim_dir_name, laser_file): + self.INPUT_DATA_DIR = input_data_dir + self.SIM_DIR_NAME = sim_dir_name + self.LASER_FILE = laser_file + + def calculate_time(self, df, min_temp, max_temp, selected_nodes, collection_rate=0.02, plot_graph=False): # Notice 'self' added as the first argument + total_time_list = [] + + for column in tqdm(df.columns, desc="Processing nodes"): + time_axis = np.arange(0, df[column].size * collection_rate, collection_rate) + + # Find indices where temperature is within the desired range + in_range_indices = np.where((df[column] >= min_temp) & (df[column] <= max_temp))[0] + + # Check if there are any in-range values + if len(in_range_indices) == 0: + total_time_list.append(0) + continue + + # Calculate time between first and last in-range value for this column + time_diff = (in_range_indices[-1] - in_range_indices[0]) * collection_rate + total_time_list.append(time_diff) + + # If plotting is enabled and this column is one of the selected nodes, then plot + if plot_graph and str(column) in selected_nodes: + plt.figure(figsize=(10,5)) + plt.plot(time_axis, df[column], label=f"Node {column}") + if len(in_range_indices) > 0: + plt.fill_between(time_axis, + min_temp, + max_temp, + where=((df[column] >= min_temp) & (df[column] <= max_temp)), + color='gray', alpha=0.5, label=f"Temp between {min_temp} and {max_temp}") + + # Adding horizontal lines for min and max temperature + plt.axhline(min_temp, color='red', linestyle='--', label=f"Min Temp {min_temp}") + plt.axhline(max_temp, color='blue', linestyle='--', label=f"Max Temp {max_temp}") + + plt.xlabel("Time (seconds)") + plt.ylabel("Temperature") + plt.title(f"Temperature vs Time for Node {column}") + plt.legend() + plt.grid(True) + + # Save the figure to the same directory as the zarr file, with a specific filename for the node + #figure_path = os.path.join(os.path.dirname(zarr_location), f"Node_{column}_Temperature_vs_Time.png") + #plt.savefig(figure_path) # Save the figure first + plt.show() # Then show the figure + + return np.mean(total_time_list) + + def run_simulation_and_analyze(self, zarr_location, min_temp, max_temp, selected_nodes_list, collection_rate=0.02, plot_graph=False): + # Create an instance of the simulator + simulator = GammaModelSimulator( + input_data_dir=self.INPUT_DATA_DIR, + sim_dir_name=self.SIM_DIR_NAME, + laser_file=self.LASER_FILE) + + # Set up the simulation + simulator.setup_simulation() + + # Run the simulation + simulator.run_simulation() + + # Open the zarr file + zarr_array = zarr.open(zarr_location, mode='r') + + # Convert the zarr array into a pandas DataFrame + df = pd.DataFrame(zarr_array[:]) + + return self.calculate_time(df, min_temp, max_temp, selected_nodes_list, collection_rate, plot_graph) + diff --git a/try.ipynb b/try.ipynb new file mode 100644 index 0000000..e69de29