{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# LLEPE Tutorial - Getting started\n", "## Introduction\n", "In this notebook, you will learn how to use LLEPE to fit thermodynamic parameters to experimental data and explore how well the parameters fit.\n", "## Installation\n", "Create a conda environment with the following command. The environment name in this example is \"thermo_env\".
\n", "```$ conda create --name thermo_env python=3.7```
\n", "Then run the following line to activate the environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```$ conda activate thermo_env```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In your terminal run
\n", "```$ git clone https://xgitlab.cels.anl.gov/summer-2020/parameter-estimation.git```
\n", "Navigate into the folder with
\n", "```$ cd parameter-estimation```
\n", "And run
\n", "```pip install -e.```
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import and instantiate LLEPE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, you will need to import the package and instantiate LLEPE with a few parameters." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "ModuleNotFoundError", "evalue": "No module named 'llepe'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mllepe\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mLLEPE\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m opt_dict = {'Nd(H(A)2)3(org)_h0': {'upper_element_name': 'species',\n\u001b[1;32m 3\u001b[0m \u001b[0;34m'upper_attrib_name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'name'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m'upper_attrib_value'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'Nd(H(A)2)3(org)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m'lower_element_name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'h0'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'llepe'" ] } ], "source": [ "from llepe import LLEPE\n", "opt_dict = {'Nd(H(A)2)3(org)_h0': {'upper_element_name': 'species',\n", " 'upper_attrib_name': 'name',\n", " 'upper_attrib_value': 'Nd(H(A)2)3(org)',\n", " 'lower_element_name': 'h0',\n", " 'lower_attrib_name': None,\n", " 'lower_attrib_value': None,\n", " 'input_format': '{0}',\n", " 'input_value': -4.7e6}}\n", "llepe_parameters = {'exp_csv_filename': '../../data/csvs/Nd_exp_data.csv',\n", " 'phases_xml_filename': '../../data/xmls/twophase.xml',\n", " 'opt_dict': opt_dict,\n", " 'phase_names': ['HCl_electrolyte', 'PC88A_liquid'],\n", " 'aq_solvent_name': 'H2O(L)',\n", " 'extractant_name': '(HA)2(org)',\n", " 'diluant_name': 'dodecane',\n", " 'complex_names': ['Nd(H(A)2)3(org)'],\n", " 'extracted_species_ion_names': ['Nd+++'],\n", " 'aq_solvent_rho': 1000.0,\n", " 'extractant_rho': 960.0,\n", " 'diluant_rho': 750.0}\n", "estimator = LLEPE(**llepe_parameters)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parameters explanation " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### exp_csv_filename" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "exp_csv_filename is the file name for the csv containing experimental data.
\n", "Let us get the pandas dataframe created by LLEPE." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "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", "
h_ih_eqz_iz_eqNd_aq_iNd_aq_eqNd_d_eq
00.010.08830410.9216960.0500010.02391.0921
10.010.10509410.9049060.0999980.06830.4641
20.010.10901710.9009830.1500060.11700.2821
30.010.10601210.9039880.2000040.16800.1905
40.010.11893410.8910660.3000110.26370.1377
\n", "
" ], "text/plain": [ " h_i h_eq z_i z_eq Nd_aq_i Nd_aq_eq Nd_d_eq\n", "0 0.01 0.088304 1 0.921696 0.050001 0.0239 1.0921\n", "1 0.01 0.105094 1 0.904906 0.099998 0.0683 0.4641\n", "2 0.01 0.109017 1 0.900983 0.150006 0.1170 0.2821\n", "3 0.01 0.106012 1 0.903988 0.200004 0.1680 0.1905\n", "4 0.01 0.118934 1 0.891066 0.300011 0.2637 0.1377" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "searcher.get_exp_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The rows are for experiments, and the columns are for the measured quantaties.
\n", "LLEPE is looking for the ordering of these columns so it is important your experimental file has this ordering. Column names do not matter.
\n", "Below is a table explaining the meaning of the column headers and the needed column order.
\n", "If you have more than one rare earth element, append the data to the end in the same order (aq_i, aq_eq, d_eq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Order | Column | Meaning |\n", "|-------|------------|--------------------------------------------------------------------|\n", "| 0 | h_i | Initial Concentration of H+ ions (mol/L) |\n", "| 1 | h_eq | Equilibrium concentration of H+ ions (mol/L) |\n", "| 2 | z_i | Initial concentration of extractant (mol/L) |\n", "| 3 | z_eq | Equilibrium concentration of extractant (mol/L) |\n", "| 4 | \\{RE\\}\\_aq_i | Initial concentration of RE ions (mol/L) |\n", "| 5 | \\{RE\\}\\_aq_eq | Equilibrium concentration of RE ions in aqueous phase (mol/L) |\n", "| 6 | \\{RE\\}\\_d_eq | Equilibrium Ratio between amount of RE atoms in organic to aqueous |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### phases_xml_filename" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the xml file containing information to be loaded into Cantera, the thermodynamic modeling package.
\n", "Please see parameter-estimation/data/xmls for file examples.
\n", "We can explore what has been loaded." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[, ]\n" ] } ], "source": [ "print(searcher.get_phases())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is a list of two Cantera solutions so we will dig in a little further and see what species these solutions contain." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HCl_electrolyte\n", "['H2O(L)', 'H+', 'OH-', 'Cl-', 'Nd+++']\n", "PC88A_liquid\n", "['(HA)2(org)', 'dodecane', 'Nd(H(A)2)3(org)']\n" ] } ], "source": [ "for phase in searcher.get_phases():\n", " print(phase.name)\n", " print(phase.species_names)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can explore Cantera solutions further by visiting https://cantera.org/ and seeing Cantera's documentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### opt_dict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a dictionary that contains the information about what species and what thermodynamic properties are to be modified.
\n", "The number after the thermodynamic property is the initial guess for the optimizer.
\n", "In this example, we chose to optimize the standard enthalpy (h0) of the neodymium-PC88A complex ('Nd(H(A)2)3(org)') and give it an initial guess of -4.7e6. Thus,
\n", "```python \n", "opt_dict={'Nd(H(A)2)3(org)': {'h0': -4.7e6}}```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Say we wanted to also modify the extractant ('(HA)2(org)'), but this time change both the standard enthalpy (h0) and the molar volume (molarVolume), then the dictionary would be\n", "```python \n", "opt_dict={'Nd(H(A)2)3(org)': {'h0': -4.7e6, 'molarVolume':1.01},\n", " '(HA)2(org)': {'h0': -4.7e6, 'molarVolume':1.01}}```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### phase_names" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This a list of the phase names in the xml file and can be found in the field phase id." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Names and rhos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Parameter | Meaning | Example value |\n", "|---------------------|----------------------------------------------|-------------------|\n", "| aq_solvent_name | Name of solvent in aqueous phase | 'H2O(L)' |\n", "| extractant_name | Name of extractant in organic phase | '(HA)2(org)' |\n", "| diluant_name | Name of diluant in organic phase | 'dodecane' |\n", "| complex_name | Name of rare earth complex in organic phase | 'Nd(H(A)2)3(org)' |\n", "| rare_earth_ion_name | Name of rare earth ion name in aqueous phase | 'Nd+++' |\n", "| rhos | Density of species (g/L) | 1000 for 'H2O(L)' |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the variables containing \"rho\", these parameters can be left \"None\", and molecular weight and molar volume will be used to calculate density.
However, molar volume values may be wrong and mess up calculations so it is recommended to find density values and replace the default values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fitting thermodynamic properties to data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that the thermodynamic properties have been set, we now need to set up the optimizer.
The default optimizer is from scipy.optimize.minimize with the arguments below. The optimizer optimizes a value multiplied by the initial guess.
Say $x$ is the variable controlled by the minimizer, the value that is entering the objective function is $x\\times\\mathrm{Guess\\,value}$. So for our case, the values tested are $(4.6\\times 10^6)x$. This is more important for bounds and constraints." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "minimizer_kwargs = {\"method\": 'SLSQP',\n", " \"bounds\": [(1e-1, 1e1)],\n", " \"constraints\": (),\n", " \"options\": {'disp': True, \n", " 'maxiter': 1000, \n", " 'ftol': 1e-6}}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the minimizer arguments defined, we can perform our fit.
\n", "This minimizes the log mean squared error between the predicted and experimental Distribution ratio (D)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimization terminated successfully. (Exit mode 0)\n", " Current function value: 0.025193288852542232\n", " Iterations: 4\n", " Function evaluations: 16\n", " Gradient evaluations: 4\n", "{'Nd(H(A)2)3(org)': {'h0': -4704699.156668724}}\n" ] } ], "source": [ "est_enthalpy = searcher.fit()\n", "print(est_enthalpy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the fit function returns an identical structure to opt_dict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Updating the xml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have our new values, let us write them to our original xml to replace the old values" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "searcher.update_xml(est_enthalpy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization and analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also see how well this new xml data fits to the experimental data with a parity plot." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "searcher.parity_plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also find what the r-squared value is. The closer to 1, the better the prediction model." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9970803631106648\n" ] } ], "source": [ "print(searcher.r_squared())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yay! Good job! That is an amazing fit." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.5" } }, "nbformat": 4, "nbformat_minor": 4 }