diff --git a/examples/rate_equations_1.ipynb b/examples/rate_equations_1.ipynb new file mode 100644 index 0000000..eb84cda --- /dev/null +++ b/examples/rate_equations_1.ipynb @@ -0,0 +1,238 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first import all the necessary functions and classes" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from NanoParticleTools.inputs.spectral_kinetics import SpectralKinetics\n", + "from NanoParticleTools.species_data import Dopant\n", + "\n", + "from NanoParticleTools.analysis import get_wavelengths, mean_population_to_intensities\n", + "from NanoParticleTools.analysis.util import get_spectrum_wavelength_from_intensities\n", + "from NanoParticleTools.util.conversions import wavenumber_to_wavelength\n", + "\n", + "from matplotlib import pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's set up the conditions for the simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# We'll be simulating a nanoparticle with Yb and Tm dopants.\n", + "dopants = [\n", + " Dopant('Yb', 0.93),\n", + " Dopant('Tm', 0.07)\n", + "]\n", + "\n", + "excitation_power = 1e5 # W/cm^2\n", + "excitation_wavelength = 980 # nm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create the spectral kinetics class. The `SpectralKinetics` module is responsible for enumerating\n", + "and calculating the rates for each transition." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "sk = SpectralKinetics(dopants,\n", + " excitation_wavelength=excitation_wavelength,\n", + " excitation_power=excitation_power)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Integrate the rate equations from t = 0 ms to t = 10 ms" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "solution = sk.run_kinetics(t_span=(0, 0.01))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the population evolution" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tKurq22uRERERNqr+e/t9jwQQyGoDTU1NQAUFRXZXImIiIh0VE1NDdnZ2Udso2eHtSEUCrFr1y4yMzOxLCum311dXU1RURHbt2/Xc8niSOe5c+g8dw6d586jc9054nWejTHU1NTQp0+fFg9Wb41GgtrgcDjo169fXPvIysrSf2CdQOe5c+g8dw6d586jc9054nGejzYC1EwLo0VERCQpKQSJiIhIUlIIsoHX62X27Nl4vV67S+nWdJ47h85z59B57jw6150jEc6zFkaLiIhIUtJIkIiIiCQlhSARERFJSgpBIiIikpQUgkRERCQpKQQdg7lz5zJw4EBSUlIYN24cS5cuPWL7BQsWMGzYMFJSUvjKV77Ca6+91uJzYwx33HEHvXv3JjU1lYkTJ7Jx48YWbSorK/nOd75DVlYWOTk5XHPNNRw4cCDmx5ZIOvs8FxcXc8011zBo0CBSU1M57rjjmD17Nj6fLy7Hlyjs+Pe5WWNjIyNHjsSyLFatWhWrQ0pIdp3nV199lXHjxpGamkpubi5Tp06N5WElJDvO9YYNG/j6179Oz549ycrK4qyzzmLx4sUxP7ZEEuvz/NJLLzFp0iTy8vLa/DOhoaGBm266iby8PDIyMvjmN79JWVnZsR+EkQ557rnnjMfjMU888YT54osvzLXXXmtycnJMWVlZq+0/+OAD43Q6ze9//3uzZs0ac/vttxu3221Wr14dafO73/3OZGdnm5dfftl8+umn5tJLLzWDBg0y9fX1kTZf/epXzYgRI8xHH31k/v3vf5shQ4aYq666Ku7Haxc7zvPrr79uvvvd75o333zTbN682fz97383+fn55sc//nGnHLMd7Pr3udl///d/m4suusgAZuXKlfE6TNvZdZ5feOEFk5ubax566CGzfv1688UXX5j58+fH/XjtZNe5Pv74483FF19sPv30U7NhwwZz4403mrS0NLN79+64H7Md4nGe//rXv5o777zTPProo23+mXD99deboqIis2jRIrNs2TJz+umnmzPOOOOYj0MhqIPGjh1rbrrppsjvwWDQ9OnTx8yZM6fV9ldccYW55JJLWmwbN26c+f73v2+MMSYUCpnCwkJzzz33RD7fv3+/8Xq95v/+7/+MMcasWbPGAOaTTz6JtHn99deNZVlm586dMTu2RGLHeW7N73//ezNo0KBoDiWh2XmeX3vtNTNs2DDzxRdfdPsQZMd59vv9pm/fvuaxxx6L9eEkNDvOdXl5uQHMe++9F2lTXV1tALNw4cKYHVsiifV5PtTWrVtb/TNh//79xu12mwULFkS2rV271gBmyZIlx3Qcmg7rAJ/Px/Lly5k4cWJkm8PhYOLEiSxZsqTVfZYsWdKiPcDkyZMj7bdu3UppaWmLNtnZ2YwbNy7SZsmSJeTk5DBmzJhIm4kTJ+JwOPj4449jdnyJwq7z3Jqqqip69OgRzeEkLDvPc1lZGddeey3/8z//Q1paWiwPK+HYdZ5XrFjBzp07cTgcjBo1it69e3PRRRfx+eefx/oQE4Zd5zovL48TTjiBv/71r9TW1hIIBHj44YfJz89n9OjRsT5M28XjPLfH8uXL8fv9Lb5n2LBh9O/fv0PfcyiFoA6oqKggGAxSUFDQYntBQQGlpaWt7lNaWnrE9s3vR2uTn5/f4nOXy0WPHj3a7Lcrs+s8f9mmTZv485//zPe///1jOo5EZ9d5Nsbw3e9+l+uvv75FsO+u7DrPW7ZsAeCXv/wlt99+O6+88gq5ubmce+65VFZWRn9gCciuc21ZFm+//TYrV64kMzOTlJQU7rvvPt544w1yc3NjcmyJJB7nuT1KS0vxeDzk5ORE9T2HUggSacXOnTv56le/yuWXX861115rdzndyp///GdqamqYNWuW3aV0a6FQCIDbbruNb37zm4wePZonn3wSy7JYsGCBzdV1L8YYbrrpJvLz8/n3v//N0qVLmTp1KlOmTGH37t12lydHoBDUAT179sTpdB62Er2srIzCwsJW9yksLDxi++b3o7XZs2dPi88DgQCVlZVt9tuV2XWem+3atYvzzjuPM844g0ceeSSqY0lkdp3nd955hyVLluD1enG5XAwZMgSAMWPGMH369OgPLMHYdZ579+4NwPDhwyOfe71eBg8eTElJSRRHlLjs/Hf6lVde4bnnnuPMM8/k1FNP5cEHHyQ1NZWnn346JseWSOJxntujsLAQn8/H/v37o/qeQykEdYDH42H06NEsWrQosi0UCrFo0SLGjx/f6j7jx49v0R5g4cKFkfaDBg2isLCwRZvq6mo+/vjjSJvx48ezf/9+li9fHmnzzjvvEAqFGDduXMyOL1HYdZ4hPAJ07rnnRv5Xs8PRff8Tses8P/DAA3z66aesWrWKVatWRS6TnT9/Pr/97W9jeoyJwK7zPHr0aLxeL+vXr4+08fv9FBcXM2DAgJgdXyKx61zX1dUBHPbnhcPhiIzIdSfxOM/tMXr0aNxud4vvWb9+PSUlJR36nhaOaTl1EnvuueeM1+s1Tz31lFmzZo257rrrTE5OjiktLTXGGHP11VebW2+9NdL+gw8+MC6Xy/zhD38wa9euNbNnz2718sucnBzz97//3Xz22Wfm61//equXyI8aNcp8/PHH5v333zfHH398t79EvrPP844dO8yQIUPMBRdcYHbs2GF2794deXVXdv37fKi2rgTpTuw6zzfffLPp27evefPNN826devMNddcY/Lz801lZWXnHXwns+Ncl5eXm7y8PPONb3zDrFq1yqxfv97ccsstxu12m1WrVnXuCegk8TjPe/fuNStXrjSvvvqqAcxzzz1nVq5c2eLP4Ouvv97079/fvPPOO2bZsmVm/PjxZvz48cd8HApBx+DPf/6z6d+/v/F4PGbs2LHmo48+inw2YcIEM3369Bbtn3/+eTN06FDj8XjMSSedZF599dUWn4dCIfOLX/zCFBQUGK/Xay644AKzfv36Fm327t1rrrrqKpORkWGysrLMjBkzTE1NTdyOMRF09nl+8sknDdDqqzuz49/nQyVDCDLGnvPs8/nMj3/8Y5Ofn28yMzPNxIkTzeeffx63Y0wUdpzrTz75xEyaNMn06NHDZGZmmtNPP9289tprcTvGRBDr89zWn8GzZ8+OtKmvrzc33nijyc3NNWlpaeayyy6L6n+oWsYYc2xjSCIiIiJdV/dd8CAiIiJyBApBIiIikpQUgkRERCQpKQSJiIhIUlIIEhERkaSkECQiIiJJSSFIREREkpJCkIiIiCQlhSARSQiWZWFZFu+++67dpYhIklAIEpGoNQeYY3k99dRTdpcvIknKZXcBItL1FRQUtLr9wIED1NbWHrFNamoqACeccAIAaWlpcahQRORwenaYiMTNL3/5S+68804A9EeNiCQaTYeJiIhIUlIIEpGE0NbC6OLi4shnxcXFbNu2jWuvvZb+/fuTkpLCcccdx+233x6ZdgP4/PPP+c///E+KiopISUnh+OOP5ze/+Q1+v/+INRQXF/PDH/6Qk046iYyMDNLS0hg2bBg333wzJSUl8ThsANatW8d1113H0KFDSUtLIyUlhaKiIk4//XR+/vOfs27durj1LZLUjIhInMyePdsApj1/1DS3W7x4cYvtW7dujXz24osvmpycHAOYrKws43Q6I5+dffbZxufzmVdeecWkpaUZwGRnZxvLsiJtrrzyyjb7/9///V/j9Xojbb1er0lNTY38npmZad58881oT8lh3nrrrRb9ut3uyDE2v2bPnh3zfkXEGI0EiUiXcc011zB69Gi++OILqqqqqKmp4YEHHsDpdPLvf/+bX/3qV3znO99hypQpFBcXs3//fqqrq7ntttsAmD9/Pm+//fZh37tw4UKmTZtGMBjkpz/9KVu3bqW+vp7a2lrWrVvH5ZdfTk1NDZdffnnMR4RuuOEGGhsbmTRpEqtXr8bn87Fv3z7q6+v5/PPPufPOOxk4cGBM+xSRJnanMBHpvmI9EnTSSSeZhoaGw/a9+uqrI20uvPBCEwqFDmtz9tlnG8Bcc801LbYHg0Fz/PHHG8A8/PDDbdZ36aWXGsDcfPPNRz2W9iorK4vUvWvXrph9r4i0j0aCRKTL+NGPfoTX6z1s++TJkyM/33rrrViW1Wabzz77rMX29957j40bN9KzZ0++973vtdn3tGnTAHjzzTePqfbWZGZm4nCE/xjevXt3zL5XRNpH9wkSkS5j7NixrW4/9B5Ep5122hHb7Nu3r8X2Dz74AICqqir69OnTZt8+nw+Abdu2tb/go0hNTeWCCy5g4cKFfPWrX+X666/nkksuYdSoUXg8npj1IyKt00iQiHQZmZmZrW53uVztbvPlK8R27doV2V5WVtbmqzk81dfXR30ch3rssccYMWIE5eXl/PrXv+b0008nMzOTs846i3vuuYfKysqY9iciBykEiUhSCwaDAIwbNw5jTLtesdS/f39WrFjBG2+8wX//938zevRoQqEQH3zwAT/96U8ZMmQI77zzTkz7FJEwhSARSWqFhYVAbKe5OsrhcDB58mT+9Kc/sWzZMiorK3nmmWfo378/+/bt49vf/nZkOk5EYkchSESS2plnnglAaWkpy5Yts7masMzMTL797W/z+OOPA1BWVsbq1attrkqk+1EIEpGkdt555zFkyBAgfPXZ0UZcYrlG52h9NT9cFohcRSYisaP/qkQkqblcLubNm4fL5eL999/nnHPOYdGiRS0WUG/ZsoV58+Zx2mmn8eCDDx72Heeeey6WZXX4poYffvghp5xyCn/84x9Zu3YtoVAICD9s9sMPP+SGG24AoF+/fpxyyinHfpAi0ipdIi8iSe+CCy5gwYIFTJs2jY8//piJEyfidrvJysriwIEDNDY2RtpOnTo1pn2vXr2amTNnMnPmzEifVVVVBAIBALKysnj22WdxOp0x7VdEFIJERIBwuNm0aRMPPvggr7/+Ohs3bmT//v2kp6czbNgwTjvtNC655BIuvvjiw/bduXMnAKeffnqH+jzttNN4/vnnWbx4MUuXLmXXrl1UVFSQkpLCkCFDmDRpEjfffPMR718kIsfOMrG+3lNEJIns2LGDoqIinE4na9asYejQoXaXJCLtpDVBIiJRaL6Hz/Tp0xWARLoYhSARkSgsXrwYr9fL7Nmz7S5FRDpI02EiIiKSlDQSJCIiIklJIUhERESSkkKQiIiIJCWFIBEREUlKCkEiIiKSlBSCREREJCkpBImIiEhSUggSERGRpKQQJCIiIklJIUhERESS0v8HNcnBslOkmUcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(*solution)\n", + "plt.xlabel('Time, s', fontsize=18)\n", + "plt.ylabel('Population', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the spectra that results from the steady state population. \n", + "\n", + "Note: Negative wavelength corresponds to emissions and positive to absorption" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/sivonxay/opt/anaconda3/envs/npmc_env/code/NanoParticleTools/src/NanoParticleTools/util/conversions.py:11: RuntimeWarning: divide by zero encountered in divide\n", + " return 1 / wavenumber * 1e7\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Intensity, cps (per volume)')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x_range = -2000, 1000\n", + "x_step = 5\n", + "volume = 1\n", + "\n", + "final_population = solution[1][-1]\n", + "\n", + "intensities = mean_population_to_intensities(sk, final_population, volume)\n", + "wavelengths = get_wavelengths(sk)\n", + "x, y = get_spectrum_wavelength_from_intensities(wavelengths, intensities)\n", + "\n", + "plt.plot(x, y)\n", + "plt.xlabel('Wavelength, nm', fontsize=18)\n", + "plt.ylabel('Intensity, cps (per volume)', fontsize=18)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we switch off the excitation and look at the decay of the states." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "decay_sk = SpectralKinetics(dopants,\n", + " excitation_wavelength=excitation_wavelength,\n", + " excitation_power=0)\n", + "decay_solution = decay_sk.run_kinetics(solution[1][-1], t_span=(0, 0.02))\n", + "plt.plot(*decay_solution)\n", + "plt.xlabel('Time, s', fontsize=18)\n", + "plt.ylabel('Population', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "npmc_env", + "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.11" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/rate_equations_2.ipynb b/examples/rate_equations_2.ipynb new file mode 100644 index 0000000..2c85d5a --- /dev/null +++ b/examples/rate_equations_2.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/sivonxay/opt/anaconda3/envs/npmc_env/lib/python3.10/site-packages/maggma/utils.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from tqdm.autonotebook import tqdm\n" + ] + } + ], + "source": [ + "from NanoParticleTools.differential_kinetics import get_diff_kinetics_parser, DifferentialKinetics\n", + "from monty.serialization import dumpfn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "High-throughput rate equation solver uses the maggma builder." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "dk = DifferentialKinetics(num_samples=10,\n", + " excitation_power=[1e3, 1e5],\n", + " excitation_wavelength=[800, 980],\n", + " possible_dopants=['Yb', 'Er', 'Nd', 'Tm'],\n", + " max_dopants=3,\n", + " include_spectra=True,\n", + " output_file='out.h5',\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we run the builder. This function call runs each sample sequentially" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10it [00:00, 6657.63it/s]" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-03 15:04:53,807 - DifferentialKinetics - INFO - Processing batch of 1000 items\n", + "2023-11-03 15:05:04,698 - SpectralKinetics - INFO - Found solution in 10.89 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/sivonxay/opt/anaconda3/envs/npmc_env/code/NanoParticleTools/src/NanoParticleTools/util/conversions.py:11: RuntimeWarning: divide by zero encountered in divide\n", + " return 1 / wavenumber * 1e7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-03 15:05:16,538 - SpectralKinetics - INFO - Found solution in 11.84 seconds\n", + "2023-11-03 15:05:16,539 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:18,130 - SpectralKinetics - INFO - Found solution in 1.59 seconds\n", + "2023-11-03 15:05:18,159 - SpectralKinetics - INFO - Found solution in 0.03 seconds\n", + "2023-11-03 15:05:18,159 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:18,167 - SpectralKinetics - INFO - Found solution in 0.01 seconds\n", + "2023-11-03 15:05:18,167 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:18,180 - SpectralKinetics - INFO - Found solution in 0.01 seconds\n", + "2023-11-03 15:05:18,180 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:18,185 - SpectralKinetics - INFO - Found solution in 0.01 seconds\n", + "2023-11-03 15:05:19,591 - SpectralKinetics - INFO - Found solution in 1.41 seconds\n", + "2023-11-03 15:05:19,592 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:20,524 - SpectralKinetics - INFO - Found solution in 0.93 seconds\n", + "2023-11-03 15:05:20,524 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:20,985 - SpectralKinetics - INFO - Found solution in 0.46 seconds\n", + "2023-11-03 15:05:20,991 - SpectralKinetics - INFO - Found solution in 0.00 seconds\n", + "2023-11-03 15:05:20,991 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:20,996 - SpectralKinetics - INFO - Found solution in 0.01 seconds\n", + "2023-11-03 15:05:20,996 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:20,998 - SpectralKinetics - INFO - Found solution in 0.00 seconds\n", + "2023-11-03 15:05:27,735 - SpectralKinetics - INFO - Found solution in 6.74 seconds\n", + "2023-11-03 15:05:27,736 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:28,482 - SpectralKinetics - INFO - Found solution in 0.75 seconds\n", + "2023-11-03 15:05:30,691 - SpectralKinetics - INFO - Found solution in 2.21 seconds\n", + "2023-11-03 15:05:30,691 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:05:31,170 - SpectralKinetics - INFO - Found solution in 0.48 seconds\n", + "2023-11-03 15:05:32,975 - SpectralKinetics - INFO - Found solution in 1.80 seconds\n", + "2023-11-03 15:05:55,912 - SpectralKinetics - INFO - Found solution in 22.94 seconds\n", + "2023-11-03 15:06:00,037 - SpectralKinetics - INFO - Found solution in 4.12 seconds\n", + "2023-11-03 15:06:00,037 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:06:01,291 - SpectralKinetics - INFO - Found solution in 1.25 seconds\n", + "2023-11-03 15:06:01,291 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:06:02,131 - SpectralKinetics - INFO - Found solution in 0.84 seconds\n", + "2023-11-03 15:06:02,131 - SpectralKinetics - INFO - Using user input initial population\n", + "2023-11-03 15:06:02,824 - SpectralKinetics - INFO - Found solution in 0.69 seconds\n", + "2023-11-03 15:06:02,827 - h5py._conv - DEBUG - Creating converter from 5 to 3\n" + ] + } + ], + "source": [ + "dk.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To parallelize over available cores on a system, we need to use `mrun` from maggma.\n", + "\n", + "First, we dump the builder to json" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "dumpfn(dk, 'diff_eq.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the builder with 4 parallel workers, invoke the command: `mrun -n 4 diff_eq.json`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "npmc_env", + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/NanoParticleTools/analysis/simulation_replayer.py b/src/NanoParticleTools/analysis/simulation_replayer.py index 63b74b1..921acd0 100644 --- a/src/NanoParticleTools/analysis/simulation_replayer.py +++ b/src/NanoParticleTools/analysis/simulation_replayer.py @@ -109,7 +109,7 @@ def run(self, step_size=1e-5, normalize=True): for i, (state, site) in enumerate( zip(self.initial_states, self.sites)): _state = state_map_species_name[str( - site.specie)][state] + site.specie.symbol)][state] states[seed][i, _state] = 1 self.save_populations(states, seed, 0, x, @@ -128,8 +128,8 @@ def run(self, step_size=1e-5, normalize=True): len(x[seed]) * step_size, x, population_evolution, site_evolution, step_size) - return (simulation_time, event_statistics, x, - population_evolution, site_evolution) + return (simulation_time, event_statistics, x, population_evolution, + site_evolution) def update_state(self, states, row, state_map_species_id): seed = row[0] @@ -143,18 +143,43 @@ def update_state(self, states, row, state_map_species_id): # Update the states for the sites corresponding # to this interaction event # Apply the event to the donor site - states[seed][donor_i][state_map_species_id[ - _interaction['species_id_1']][_interaction['left_state_1']]] = 0 - states[seed][donor_i][state_map_species_id[ - _interaction['species_id_1']][_interaction['right_state_1']]] = 1 + + current_left_state = states[seed][donor_i][state_map_species_id[ + _interaction['species_id_1']][_interaction['left_state_1']]] + current_right_state = states[seed][donor_i][state_map_species_id[ + _interaction['species_id_1']][_interaction['right_state_1']]] + if current_left_state == 1 and current_right_state == 0: + states[seed][donor_i][state_map_species_id[_interaction[ + 'species_id_1']][_interaction['left_state_1']]] = 0 + states[seed][donor_i][state_map_species_id[_interaction[ + 'species_id_1']][_interaction['right_state_1']]] = 1 + else: + raise RuntimeError('Inconsistent simulation state encountered. ' + 'Please rerun the simulation. If this issue ' + 'persists, please raise a github issue') if _interaction['number_of_sites'] == 2: # If this is a two-site interaction, apply # the event to the acceptor ion - states[seed][acceptor_i][state_map_species_id[_interaction[ - 'species_id_2']][_interaction['left_state_2']]] = 0 - states[seed][acceptor_i][state_map_species_id[_interaction[ - 'species_id_2']][_interaction['right_state_2']]] = 1 + + current_left_state = states[seed][acceptor_i][state_map_species_id[ + _interaction['species_id_2']][_interaction['left_state_2']]] + current_right_state = states[seed][acceptor_i][ + state_map_species_id[_interaction['species_id_2']][ + _interaction['right_state_2']]] + + if current_left_state == 1 and current_right_state == 0: + states[seed][acceptor_i][state_map_species_id[_interaction[ + 'species_id_2']][_interaction['left_state_2']]] = 0 + states[seed][acceptor_i][state_map_species_id[_interaction[ + 'species_id_2']][_interaction['right_state_2']]] = 1 + else: + print('current left state: ', current_left_state) + print('current right state', current_right_state) + print(states) + raise RuntimeError('Inconsistent simulation state encountered.' + 'Please rerun the simulation. If this issue' + 'persists, please raise a github issue') def save_populations(self, states, seed, time, x, population_evolution, site_evolution, step_size): @@ -212,8 +237,8 @@ def generate_docs(self, if data is None: data = self.run() - (simulation_time, event_statistics, x, - population_evolution, site_evolution) = data + (simulation_time, event_statistics, x, population_evolution, + site_evolution) = data species_counter = Counter( [site['species_id'] for site in self.npmc_input.sites.values()]) normalization_factors = np.hstack( @@ -339,7 +364,7 @@ def _population_evolution_by_constraint(self, site.coords for site in self.npmc_input.nanoparticle.dopant_sites ]) species_names = np.array([ - str(site.specie) + str(site.specie.symbol) for site in self.npmc_input.nanoparticle.dopant_sites ]) @@ -353,8 +378,8 @@ def _population_evolution_by_constraint(self, np.where(constraint.sites_in_bounds(sites))[0]) for level in site_indices_by_constraint: - indices_inside_constraint = (indices_inside_constraint - - set(level)) + indices_inside_constraint = (indices_inside_constraint - + set(level)) site_indices_by_constraint.append( sorted(list(indices_inside_constraint))) diff --git a/src/NanoParticleTools/differential_kinetics/runner.py b/src/NanoParticleTools/differential_kinetics/runner.py index 9daba71..0b6dc9d 100644 --- a/src/NanoParticleTools/differential_kinetics/runner.py +++ b/src/NanoParticleTools/differential_kinetics/runner.py @@ -22,7 +22,6 @@ def __init__(self, max_dopants: int = 4, include_spectra: bool = True, output_file: str = 'out.h5', - num_workers: int = 1, max_data_per_group: int = 100000, **kwargs): if excitation_wavelength is None: @@ -39,7 +38,6 @@ def __init__(self, self.max_dopants = max_dopants self.include_spectra = include_spectra self.output_file = output_file - self.num_workers = num_workers self.max_data_per_group = max_data_per_group self.source = None self.target = None diff --git a/src/NanoParticleTools/differential_kinetics/util.py b/src/NanoParticleTools/differential_kinetics/util.py index 3add994..d76ef68 100644 --- a/src/NanoParticleTools/differential_kinetics/util.py +++ b/src/NanoParticleTools/differential_kinetics/util.py @@ -71,12 +71,6 @@ def get_diff_kinetics_parser(): type=str, default=f'{datetime.now().strftime("%Y%m%d_%H_%M_%S_%f")}.h5') - parser.add_argument('-j', - '--num_workers', - help='Number of concurrent workers', - type=int, - default=1) - parser.add_argument( '-g', '--max_data_per_group', diff --git a/src/NanoParticleTools/flows/jobs.py b/src/NanoParticleTools/flows/jobs.py index 3958349..a1a59e6 100644 --- a/src/NanoParticleTools/flows/jobs.py +++ b/src/NanoParticleTools/flows/jobs.py @@ -14,8 +14,10 @@ from NanoParticleTools.species_data.species import Dopant from NanoParticleTools.inputs.util import get_all_interactions import sqlite3 -import warnings import shutil +import logging + +LOGGER = logging.getLogger('NPMC_Job') # Save 'trajectory_doc' to the trajectories store @@ -99,8 +101,8 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], expected_tables = ['factors', 'initial_state'] all_tables_exist, missing = tables_exist(cur, expected_tables) if not all_tables_exist: - warnings.warn(f'Existing run found, but missing {missing} table.' - f'Re-initializing the simulation') + LOGGER.info(f'Existing run found, but missing {missing} table.' + f'Re-initializing the simulation') fresh_start = True cur.close() @@ -112,14 +114,14 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], expected_tables = ['metadata', 'species', 'sites', 'interactions'] all_tables_exist, missing = tables_exist(cur, expected_tables) if not all_tables_exist: - warnings.warn(f'Existing run found, but missing {missing} table.' - f'Re-initializing the simulation') + LOGGER.info(f'Existing run found, but missing {missing} table.' + f'Re-initializing the simulation') fresh_start = True # # Check the number of sites # num_dopant_site_db = len(list(cur.execute('SELECT * from sites'))) # num_dopant_sites = len(nanoparticle.dopant_sites) # if num_dopant_sites != num_dopant_site_db: - # warnings.warn( + # Logger.info( # 'Existing run found, num sites does not match.' # ' Simulation must begin from scratch') @@ -128,7 +130,7 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], # list(cur.execute('SELECT * from interactions'))) # num_interactions = len(get_all_interactions(spectral_kinetics)) # if num_interactions != num_interactions_db: - # warnings.warn( + # Logger.info( # 'Existing run found, number of interactions does not ' # 'match. Simulation must begin from scratch') @@ -142,31 +144,36 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], table_exist, _ = tables_exist(cur, ['interupt_state']) if not table_exist: - print('creating interupt_state and interupt_cutoff table') + LOGGER.info( + 'creating interupt_state and interupt_cutoff table') cur.execute(create_interupt_state_sql) cur.execute(create_interupt_cutoff_sql) cur.close() else: - warnings.warn( - 'Existing run found, but some files are missing. ') + LOGGER.info('Existing run found, but some files are missing. ') fresh_start = True if fresh_start or os.path.exists(output_dir) is False: if override or os.path.exists(output_dir) is False: + LOGGER.info('Writing new input files') # Generate Nanoparticle - nanoparticle = DopedNanoparticle(constraints, dopant_specifications, - doping_seed, prune_hosts=True) + nanoparticle = DopedNanoparticle(constraints, + dopant_specifications, + doping_seed, + prune_hosts=True) nanoparticle.generate() # Initialize Spectral Kinetics class to calculate transition rates dopants = [ - Dopant(key, concentration) - for key, concentration in nanoparticle.dopant_concentrations().items() + Dopant(key, concentration) for key, concentration in + nanoparticle.dopant_concentrations().items() ] - spectral_kinetics = SpectralKinetics(dopants, **spectral_kinetics_args) + spectral_kinetics = SpectralKinetics(dopants, + **spectral_kinetics_args) # Create an NPMCInput class - npmc_input = NPMCInput(spectral_kinetics, nanoparticle, initial_states) + npmc_input = NPMCInput(spectral_kinetics, nanoparticle, + initial_states) # Write files _initial_state_db_args = { @@ -199,6 +206,7 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], initial_state_db_path=files['initial_state_db_path']) # Actually run NPMC + LOGGER.info('Invoking C++ MC simulation') npmc_runner.run(**npmc_args) # TODO: figure out why the nanoparticle sites gets cleared. @@ -222,9 +230,11 @@ def npmc_job(constraints: Sequence[NanoParticleConstraint], if 'simulation_time' in npmc_args.keys(): for seed, simulation_time in data[0].items(): if simulation_time < npmc_args['simulation_time']: - raise RuntimeError(f'Run did not successfully complete.' - f' Simulation {seed} did not complete. Simulated' - f' {simulation_time} s of {npmc_args["simulation_time"]} s') + raise RuntimeError( + f'Run did not successfully complete.' + f' Simulation {seed} did not complete. Simulated' + f' {simulation_time} s of {npmc_args["simulation_time"]} s' + ) # get population by shell diff --git a/src/NanoParticleTools/inputs/nanoparticle.py b/src/NanoParticleTools/inputs/nanoparticle.py index c204315..21df2b1 100644 --- a/src/NanoParticleTools/inputs/nanoparticle.py +++ b/src/NanoParticleTools/inputs/nanoparticle.py @@ -349,20 +349,38 @@ def __init__(self, constraints: Sequence[NanoParticleConstraint], dopant_specification: Sequence[Tuple], seed: int = 0, - prune_hosts: bool = False): + prune_hosts: bool = False, + host_species=None): # Check if there are zero constraints if len(constraints) == 0: raise ValueError( 'There are no constraints, this particle is empty') self.constraints = constraints - host_species = [] + + if host_species is None: + # NaYF3 is the default. + host_species = ['Na', 'Y', 'F'] + + # Check if the host species is reasonable given the structure + # This is necessary in case we are rebuilding the structure after + # pruning the host elements away. + struct_species = [] for constraint in constraints: - host_species.extend( + struct_species.extend( list(set(constraint.get_host_structure().species))) - - host_species = [el.symbol for el in set(host_species)] - self.host_species = host_species + struct_species = [el.symbol for el in set(struct_species)] + + # Make sure each of the species in the struct is present in the host + all_present = True + for species in struct_species: + if species not in host_species: + all_present = False + if all_present: + self.host_species = host_species + else: + # Fall back on only the species in the present structure + self.host_species = struct_species self.seed = seed if seed is not None else 0 diff --git a/tests/analysis/test_simulation_replayer.py b/tests/analysis/test_simulation_replayer.py index 224aa86..75a74e7 100644 --- a/tests/analysis/test_simulation_replayer.py +++ b/tests/analysis/test_simulation_replayer.py @@ -1 +1,65 @@ from NanoParticleTools.analysis.simulation_replayer import SimulationReplayer +from pymatgen.core import Composition, DummySpecies, Element +from pathlib import Path + +import pytest + +MODULE_DIR = Path(__file__).absolute().parent +TEST_FILE_DIR = MODULE_DIR / '..' / 'test_files' + + +@pytest.fixture() +def sim_replayer(): + replayer = SimulationReplayer(trajectories_db_file=TEST_FILE_DIR / + 'simulation_output/initial_state.sqlite', + npmc_input_file=TEST_FILE_DIR / + 'simulation_output/npmc_input.json') + return replayer + + +def test_sim_replayer_init(sim_replayer): + assert len(sim_replayer.initial_states) == 1904 + assert len(sim_replayer.sites) == 1904 + + sim_replayer.npmc_input.nanoparticle.generate() + + # yapf: disable + assert sim_replayer.npmc_input.nanoparticle.composition == Composition({ + Element('Na'): 1238, + Element('Y'): 1808, + Element('Er'): 1186, + Element('Yb'): 285, + DummySpecies('Xsurfacesix'): 433 + }) + # yapf: enable + + +def test_sim_replayer(sim_replayer): + docs = sim_replayer.generate_docs() + + assert len(docs) == 4 + assert [doc['trajectory_doc']['dopant_seed'] + for doc in docs] == [57837, 57837, 57837, 57837] + assert set([doc['trajectory_doc']['simulation_seed'] + for doc in docs]) == set([59181, 59182, 59183, 59184]) + assert set([doc['trajectory_doc']['simulation_time'] + for doc in docs]) == set([ + 0.010000072318936497, 0.010000078244421477, + 0.010000049835387275, 0.01000011131860255 + ]) + assert docs[0]['trajectory_doc']['total_n_levels'] == 43 + assert docs[0]['trajectory_doc']['formula_by_constraint'] == [ + '', 'Yb285Er1186', 'Xsurfacesix433' + ] + assert len(docs[0]['trajectory_doc']['output']['summary_keys']) == 14 + assert len(docs[0]['trajectory_doc']['output']['summary']) == 107 + assert len(docs[0]['trajectory_doc']['output']['x_populations']) == 1002 + assert len( + docs[0]['trajectory_doc']['output']['y_overall_populations']) == 1002 + assert len( + docs[0]['trajectory_doc']['output']['y_overall_populations'][0]) == 43 + assert len( + docs[0]['trajectory_doc']['output']['y_constraint_populations']) == 3 + assert len(docs[0]['trajectory_doc']['output']['y_constraint_populations'] + [0]) == 1002 + assert len(docs[0]['trajectory_doc']['output']['final_states']) == 1904 diff --git a/tests/inputs/test_nanoparticle.py b/tests/inputs/test_nanoparticle.py index 087685c..15848d4 100644 --- a/tests/inputs/test_nanoparticle.py +++ b/tests/inputs/test_nanoparticle.py @@ -142,6 +142,21 @@ def test_host_species_dopant(): assert dnp.dopant_composition == Composition({'Yb': 10}) +def test_serialization(): + constraints = [SphericalConstraint(10)] + dopants = [(0, 0.1, 'Na', 'Y'), (0, 0.2, 'Yb', 'Y')] + dnp = DopedNanoparticle(constraints, dopants) + dnp.generate() + + dnp_dict = dnp.as_dict() + + dnp_copy = DopedNanoparticle.from_dict(dnp_dict) + dnp_copy.generate() + assert dnp_copy.host_species == ['Na', 'Y', 'F'] + assert len(dnp.sites) == len(dnp_copy.sites) + assert len(dnp.dopant_sites) == len(dnp_copy.dopant_sites) + + def test_doped_near_one(): with pytest.raises(ValueError): constraints = [SphericalConstraint(10)] diff --git a/tests/test_files/simulation_output/initial_state.sqlite b/tests/test_files/simulation_output/initial_state.sqlite new file mode 100644 index 0000000..0e9933a Binary files /dev/null and b/tests/test_files/simulation_output/initial_state.sqlite differ diff --git a/tests/test_files/simulation_output/np.sqlite b/tests/test_files/simulation_output/np.sqlite new file mode 100644 index 0000000..df74099 Binary files /dev/null and b/tests/test_files/simulation_output/np.sqlite differ diff --git a/tests/test_files/simulation_output/npmc_input.json b/tests/test_files/simulation_output/npmc_input.json new file mode 100644 index 0000000..9ffcc4e --- /dev/null +++ b/tests/test_files/simulation_output/npmc_input.json @@ -0,0 +1 @@ +{"@module": "NanoParticleTools.core", "@class": "NPMCInput", "@version": null, "spectral_kinetics": {"@module": "NanoParticleTools.inputs.spectral_kinetics", "@class": "SpectralKinetics", "@version": null, "dopants": [{"@module": "NanoParticleTools.species_data.species", "@class": "Dopant", "@version": null, "symbol": "Yb", "molar_concentration": 0.07677801724137931, "n_levels": 2}, {"@module": "NanoParticleTools.species_data.species", "@class": "Dopant", "@version": null, "symbol": "Er", "molar_concentration": 0.31950431034482757, "n_levels": 34}, {"@module": "NanoParticleTools.species_data.species", "@class": "Dopant", "@version": null, "symbol": "Xsurfacesix", "molar_concentration": 0.11664870689655173, "n_levels": 7}], "phonon_energy": 450, "zero_phonon_rate": 10000000.0, "mpr_alpha": 0.0035, "n_refract": 1.5, "volume_per_dopant_site": 0.0723946667, "min_dopant_distance": 3.867267554e-08, "time_step": 0.0001, "num_steps": 100, "ode_max_error": 1e-12, "energy_transfer_rate_threshold": 0.1, "radiative_rate_threshold": 0.0001, "stokes_shift": 150, "excitation_wavelength": 980, "excitation_power": 100000.0}, "nanoparticle": {"@module": "NanoParticleTools.inputs.nanoparticle", "@class": "DopedNanoparticle", "@version": null, "constraints": [{"@module": "NanoParticleTools.inputs.nanoparticle", "@class": "SphericalConstraint", "@version": null, "radius": 16.282959861599533, "host_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.9688, 0.0, 3.654835907375361e-16], [-2.9843999999999986, 5.169132430108558, 3.654835907375361e-16], [0.0, 0.0, 3.509]], "pbc": [true, true, true], "a": 5.9688, "b": 5.9688, "c": 3.509, "alpha": 90.0, "beta": 90.0, "gamma": 119.99999999999999, "volume": 108.26499342975134}, "sites": [{"species": [{"element": "Y", "occu": 1}], "abc": [0.3333, 0.6667, 0.75], "xyz": [-0.0002984399999990117, 3.4462605911533752, 2.6317500000000003], "label": "Y", "properties": {}}, {"species": [{"element": "Y", "occu": 1}], "abc": [0.6667, 0.3333, 0.25], "xyz": [2.9846984400000003, 1.7228718389551823, 0.8772500000000003], "label": "Y", "properties": {}}]}}, {"@module": "NanoParticleTools.inputs.nanoparticle", "@class": "SphericalConstraint", "@version": null, "radius": 34, "host_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.9688, 0.0, 3.654835907375361e-16], [-2.9843999999999986, 5.169132430108558, 3.654835907375361e-16], [0.0, 0.0, 3.509]], "pbc": [true, true, true], "a": 5.9688, "b": 5.9688, "c": 3.509, "alpha": 90.0, "beta": 90.0, "gamma": 119.99999999999999, "volume": 108.26499342975134}, "sites": [{"species": [{"element": "Y", "occu": 1}], "abc": [0.3333, 0.6667, 0.75], "xyz": [-0.0002984399999990117, 3.4462605911533752, 2.6317500000000003], "label": "Y", "properties": {}}, {"species": [{"element": "Y", "occu": 1}], "abc": [0.6667, 0.3333, 0.25], "xyz": [2.9846984400000003, 1.7228718389551823, 0.8772500000000003], "label": "Y", "properties": {}}]}}, {"@module": "NanoParticleTools.inputs.nanoparticle", "@class": "SphericalConstraint", "@version": null, "radius": 40, "host_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.9688, 0.0, 3.654835907375361e-16], [-2.9843999999999986, 5.169132430108558, 3.654835907375361e-16], [0.0, 0.0, 3.509]], "pbc": [true, true, true], "a": 5.9688, "b": 5.9688, "c": 3.509, "alpha": 90.0, "beta": 90.0, "gamma": 119.99999999999999, "volume": 108.26499342975134}, "sites": [{"species": [{"element": "Y", "occu": 1}], "abc": [0.3333, 0.6667, 0.75], "xyz": [-0.0002984399999990117, 3.4462605911533752, 2.6317500000000003], "label": "Y", "properties": {}}, {"species": [{"element": "Y", "occu": 1}], "abc": [0.6667, 0.3333, 0.25], "xyz": [2.9846984400000003, 1.7228718389551823, 0.8772500000000003], "label": "Y", "properties": {}}]}}], "dopant_specification": [[0, 0.25, "Na", "Y"], [0, 0.0009872568526039795, "Yb", "Y"], [0, 0.0004712005545970955, "Er", "Y"], [1, 0.25, "Na", "Y"], [1, 0.1422090014558058, "Yb", "Y"], [1, 0.5908739301978306, "Er", "Y"], [2, 0.25, "Na", "Y"], [2, 0.3, "Surface6", "Y"]], "seed": 57837, "prune_hosts": true}, "initial_states": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} \ No newline at end of file