diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 4b1d4fe..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.github/workflows/tomlproject.yml b/.github/workflows/tomlproject.yml new file mode 100644 index 0000000..a88f1ab --- /dev/null +++ b/.github/workflows/tomlproject.yml @@ -0,0 +1,38 @@ +name: Python Tests + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + test: + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] # Chose windows-latest, ubuntu-latest, macos-latest. + python-version: ['3.9', '3.10', '3.11', '3.12'] # Test multiple Python versions + fail-fast: false + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + + # Install + - name: Set up Python and Install Dependencies + run: | + python -m pip install --upgrade pip # Ensure pip is up to date + python -m pip install .[test] # Install the package with development dependencies from pyproject.toml + + # Lint with Ruff + # - name: Lint with Ruff + # run: | + # ruff check . --statistics + + # Run pyest + - name: Run Tests + run: | + pytest --cov=pvcircuit + # continue-on-error: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index b6e4761..9b94e40 100644 --- a/.gitignore +++ b/.gitignore @@ -106,6 +106,8 @@ celerybeat.pid .venv env/ venv/ +cenv/ +.cenv/ ENV/ env.bak/ venv.bak/ @@ -114,6 +116,9 @@ venv.bak/ .spyderproject .spyproject +# vscode project settings +.vscode + # Rope project settings .ropeproject @@ -127,3 +132,6 @@ dmypy.json # Pyre type checker .pyre/ + +# other folders +Share/ \ No newline at end of file diff --git a/README.md b/README.md index 00092cf..7ad1bf8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +[![Python Tests](https://github.com/NREL/PVcircuit/actions/workflows/tomlproject.yml/badge.svg?branch=master)](https://github.com/NREL/PVcircuit/actions/workflows/tomlproject.yml) +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) + # pvcircuit *pvcircuit* contains objects that are building blocks for PV modeling and interactive data fitting. diff --git a/notebooks/4J IMM.ipynb b/notebooks/4J IMM.ipynb index f96df37..4d6a4cb 100644 --- a/notebooks/4J IMM.ipynb +++ b/notebooks/4J IMM.ipynb @@ -16,21 +16,13 @@ "execution_count": 2, "id": "35e3d9d6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tandems version 0.989\n", - "Data path is: /Users/jgeisz/Documents/GitHub/Tandems/tandems/data/\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", + "from pvcircuit.PlotWithControls import PlotsWithControls\n", "import pvcircuit as pvc\n", "import ipywidgets as widgets\n", "#%matplotlib inline\n", @@ -97,27 +89,30 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "9ac045cc-f893-4f9a-a7f6-f82caeb74c7d", "metadata": {}, "outputs": [], "source": [ - "ui, dax, lax = MM927.controls()" + "pwc = PlotsWithControls(MM927)\n", + "ui = pwc.ui\n", + "dax = pwc.dax\n", + "lax = pwc.lax" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "fc908aa2-60a8-405f-ae73-42cb9e5e7f30", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -138,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "b1ef0475-afe7-417d-a4a0-a4e63d09e62c", "metadata": {}, "outputs": [ @@ -150,7 +145,7 @@ "\n", "j[0]: \n", "Eg = 1.83 eV, TC = 25.0 C\n", - "Jext = 12.0 , JLC = 0.0 mA/cm2\n", + "Jext = 12.0 mA/cm2, JLC = 0.0 mA/cm2\n", "Gsh = 0 S/cm2, Rser = 0 Ωcm2\n", "lightA = 1 cm2, totalA = 1.15 cm2\n", "pn = -1, beta = 0, gamma = 0\n", @@ -161,7 +156,7 @@ "\n", "j[1]: \n", "Eg = 1.40 eV, TC = 25.0 C\n", - "Jext = 11.5 , JLC = 3.9 mA/cm2\n", + "Jext = 11.5 mA/cm2, JLC = 3.9 mA/cm2\n", "Gsh = 0 S/cm2, Rser = 0 Ωcm2\n", "lightA = 1 cm2, totalA = 1.15 cm2\n", "pn = -1, beta = 14.3, gamma = 0\n", @@ -172,7 +167,7 @@ "\n", "j[2]: \n", "Eg = 1.05 eV, TC = 25.0 C\n", - "Jext = 11.4 , JLC = 0.9 mA/cm2\n", + "Jext = 11.4 mA/cm2, JLC = 0.9 mA/cm2\n", "Gsh = 0 S/cm2, Rser = 0 Ωcm2\n", "lightA = 1 cm2, totalA = 1.15 cm2\n", "pn = -1, beta = 8.6, gamma = 0\n", @@ -183,7 +178,7 @@ "\n", "j[3]: \n", "Eg = 0.74 eV, TC = 25.0 C\n", - "Jext = 12.3 , JLC = 1.5 mA/cm2\n", + "Jext = 12.3 mA/cm2, JLC = 1.5 mA/cm2\n", "Gsh = 0 S/cm2, Rser = 0 Ωcm2\n", "lightA = 1 cm2, totalA = 1.15 cm2\n", "pn = -1, beta = 10.5, gamma = 0\n", @@ -194,7 +189,7 @@ "RBB_dict: {'method': 'JFG', 'mrb': 43.0, 'J0rb': 0.3, 'Vrb': 0.0}" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -205,19 +200,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "5dd5e423-b857-4f03-8153-0746f5f58dfd", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b4bfa81d26bc4c08a5d79dc37ac7c64c", + "model_id": "5d0fc313cc7b416190deb395c2d3164d", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "VBox(children=(HBox(children=(Output(), Output()), layout=Layout(display='flex', flex_flow='row', justify_cont…" + "VBox(children=(HBox(children=(Output(outputs=({'output_type': 'display_data', 'data': {'text/plain': \"Canvas(t…" ] }, "metadata": {}, @@ -239,7 +234,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -253,7 +248,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/notebooks/MS874_3T.ipynb b/notebooks/MS874_3T.ipynb index bc2da75..8dff870 100644 --- a/notebooks/MS874_3T.ipynb +++ b/notebooks/MS874_3T.ipynb @@ -25,21 +25,13 @@ "execution_count": 2, "id": "fcd04291", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tandems version 0.989\n", - "Data path is: /Users/jgeisz/Documents/GitHub/Tandems/tandems/data/\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", + "from pvcircuit.PlotWithControls import PlotsWithControls\n", "import pvcircuit as pvc\n", "import ipywidgets as widgets\n", "#%matplotlib inline\n", @@ -49,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "3d7dd5f8-2a35-461c-a5d7-81bceee9093e", "metadata": {}, "outputs": [], @@ -60,20 +52,20 @@ "path = pvc.datapath\n", "fileA = 'MS874n4papy_C_CZ_JA.csv'\n", "fileB = 'MS874n4papy_C_CZ_JB.csv'\n", - "MS874_V_dataiv = pvc.IV3T.loadcsv('MS874_V_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A) \n", + "MS874_V_dataiv = pvc.IV3T.from_csv('MS874_V_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A)\n", "# data iv3T vs I\n", "fileA = 'MS874n4papy_C_CZ_VA.csv'\n", "fileB = 'MS874n4papy_C_CZ_VB.csv'\n", - "MS874_I_dataiv = pvc.IV3T.loadcsv('MS874_I_dataiv',path,fileA,fileB,'I','CZ', area=A) #Iscale=1000./A) \n", + "MS874_I_dataiv = pvc.IV3T.from_csv('MS874_I_dataiv',path,fileA,fileB,'I','CZ', area=A) #Iscale=1000./A)\n", "#dark data\n", "fileA = 'MS874n4Cdark_CZ_JA.csv'\n", "fileB = 'MS874n4Cdark_CZ_JB.csv'\n", - "MS874dark_dataiv = pvc.IV3T.loadcsv('MS874dark_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A) " + "MS874dark_dataiv = pvc.IV3T.from_csv('MS874dark_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "f471637c-4313-4988-8f8c-1683e5ddf91c", "metadata": {}, "outputs": [], @@ -82,7 +74,7 @@ "MS874dev3T = pvc.Tandem3T()\n", "\n", "MS874dev3T.set(name='MS874dev3T', Rz = 0.3)\n", - "MS874dev3T.top.set(Eg=1.861, n=[1.0, 1.8], J0ratio=[158, 12], Jext=0.01525, Gsh=1e-12) \n", + "MS874dev3T.top.set(Eg=1.861, n=[1.0, 1.8], J0ratio=[158, 12], Jext=0.01525, Gsh=1e-12)\n", "#MS874dev3T.top.set(Rser=1.1, beta=2e-6, area=A)\n", "MS874dev3T.top.set(Rser=1.1, beta=3e-6, area=A)\n", "\n", @@ -94,40 +86,28 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "8f62fafb-eeaa-4ea1-91a6-01102d3518a4", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1e7689fe21f7410fa8e09e1ed3919da5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(Output(), Output()), layout=Layout(display='flex', flex_flow='row', justify_cont…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "ui, Vax, Iax = MS874dev3T.controls(MS874_V_dataiv, MS874_I_dataiv, MS874dark_dataiv, hex=False)\n", - "ui" + "# ui, Vax, Iax = MS874dev3T.controls(MS874_V_dataiv, MS874_I_dataiv, MS874dark_dataiv, hex=False)\n", + "# ui\n", + "\n", + "pwc = PlotsWithControls(MS874dev3T,MS874_V_dataiv, MS874_I_dataiv, MS874dark_dataiv, hex=False)\n", + "ui = pwc.ui" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "179a3a24-50f6-4f39-bbef-493f44c54d04", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8770e51bc9104f038bcf1a5b17fdd67f", + "model_id": "9c1f15b3795949c8aeca8fa0765fe2b1", "version_major": 2, "version_minor": 0 }, @@ -147,9 +127,9 @@ "Lout = widgets.Output()\n", "Rout = widgets.Output()\n", "ToutBox = widgets.HBox([Lout, Rout])\n", - "with Lout: \n", + "with Lout:\n", " Tax.get_figure().show()\n", - "with Rout: \n", + "with Rout:\n", " Bax.get_figure().show()\n", "plt.ion()\n", "ToutBox" @@ -157,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "1484973f-fe1a-44fa-8018-0a8899ecce1c", "metadata": {}, "outputs": [ @@ -180,7 +160,7 @@ " MPPCM -3.40 0.00 3.40 1.350 -1.057 -0.294 -3.40 3.40 -1.057 -1.350 1.00 -4.81 0.00 1.162 -1.220 " ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -207,9 +187,9 @@ ], "metadata": { "kernelspec": { - "display_name": "pvdev", + "display_name": "Python 3", "language": "python", - "name": "pvdev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -221,7 +201,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/notebooks/Si1J.ipynb b/notebooks/Si1J.ipynb index 886ecad..0ff89f3 100644 --- a/notebooks/Si1J.ipynb +++ b/notebooks/Si1J.ipynb @@ -2,10 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 39, "id": "375d4fb4-1c7e-4336-985b-1c9a3df4c731", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -21,23 +30,15 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 40, "id": "5db22fdb-07ae-4891-8f09-2cdf139a2dfb", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tandems version 0.989\n", - "Data path is: /Users/jgeisz/Documents/GitHub/Tandems/tandems/data/\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "from pvcircuit.PlotWithControls import PlotsWithControls\n", "import pvcircuit as pvc\n", "import ipywidgets as widgets\n", "#%matplotlib inline\n", @@ -48,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 41, "id": "a1355795-114a-4ef0-80ae-240894491225", "metadata": {}, "outputs": [], @@ -73,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 42, "id": "d8de417f-6b01-472e-aaa0-ec9054d4aa07", "metadata": {}, "outputs": [ @@ -85,7 +86,7 @@ "\n", "j[0]: \n", "Eg = 1.10 eV, TC = 25.0 C\n", - "Jext = 39.9 , JLC = 0.0 mA/cm2\n", + "Jext = 39.9 mA/cm2, JLC = 0.0 mA/cm2\n", "Gsh = 0.000857525 S/cm2, Rser = 0 Ωcm2\n", "lightA = 3.97 cm2, totalA = 9 cm2\n", "pn = -1, beta = 0, gamma = 0\n", @@ -96,7 +97,7 @@ "RBB_dict: {'method': 'JFG', 'mrb': 10.0, 'J0rb': 0.0001, 'Vrb': 0.0}" ] }, - "execution_count": 4, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -114,14 +115,14 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 43, "id": "8b5e9767-4cfb-405b-8d21-9d20a975e075", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8255c53ef3654762b101a7eb537ad9c3", + "model_id": "38ec93bfd8d04e3eaa4d90a4b92f8769", "version_major": 2, "version_minor": 0 }, @@ -134,23 +135,28 @@ } ], "source": [ - "ui, dax, lax = SiIBC.controls()\n", + "# ui, dax, lax = SiIBC.controls()\n", + "# ui\n", + "pwc = PlotsWithControls(SiIBC)\n", + "ui = pwc.ui\n", + "dax = pwc.dax\n", + "lax = pwc.lax\n", "ui" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 44, "id": "f43aa1fc-7292-4ef4-8784-d6955051473d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -188,30 +194,46 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 53, "id": "1de60e70-3b4f-441e-a7a6-2064eb4b44d6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "38ec93bfd8d04e3eaa4d90a4b92f8769", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(HBox(children=(Output(outputs=({'output_type': 'display_data', 'data': {'text/plain': \"Canvas(t…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# change model parameters on command line and update within the widget controls\n", "SiIBC.set(n = [1., 2.], J0ratio = [100., 10.], Rs2T = 0.5) # better ISFH fit\n", - "SiIBC.update()" + "pwc.update_Multi2T()\n", + "pwc.ui" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 46, "id": "18f0067a-615d-4a6d-8360-c1c36d0273c5", "metadata": {}, "outputs": [], "source": [ - "#SiIBC.set(n = [1., 2.], J0ratio = [200., 15.], Gsh=0.00065, Rs2T = 8.3) # NREL fit \n", + "#SiIBC.set(n = [1., 2.], J0ratio = [200., 15.], Gsh=0.00065, Rs2T = 8.3) # NREL fit\n", "#SiIBC.update()" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 47, "id": "2f46b2a8-d545-43c8-953a-227587b03b67", "metadata": {}, "outputs": [], @@ -222,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 48, "id": "671bde90-2ce7-40d0-b093-809e82f01cc0", "metadata": {}, "outputs": [ @@ -234,7 +256,7 @@ "\n", "j[0]: \n", "Eg = 1.10 eV, TC = 25.0 C\n", - "Jext = 39.9 , JLC = 0.0 mA/cm2\n", + "Jext = 39.9 mA/cm2, JLC = 0.0 mA/cm2\n", "Gsh = 0.000857525 S/cm2, Rser = 0 Ωcm2\n", "lightA = 3.97 cm2, totalA = 9 cm2\n", "pn = -1, beta = 0, gamma = 0\n", @@ -245,7 +267,7 @@ "RBB_dict: {'method': 'JFG', 'mrb': 10.0, 'J0rb': 0.0001, 'Vrb': 0.0}" ] }, - "execution_count": 10, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -265,9 +287,9 @@ ], "metadata": { "kernelspec": { - "display_name": "pvdev", + "display_name": "Python 3", "language": "python", - "name": "pvdev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -279,7 +301,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/notebooks/WB417_3T.ipynb b/notebooks/WB417_3T.ipynb index 40ee452..fd0cfc4 100644 --- a/notebooks/WB417_3T.ipynb +++ b/notebooks/WB417_3T.ipynb @@ -2,10 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 11, "id": "aadb3f93", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -22,19 +31,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "id": "fcd04291", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tandems version 0.989\n", - "Data path is: /Users/jgeisz/Documents/GitHub/Tandems/tandems/data/\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", @@ -42,6 +42,7 @@ "import matplotlib as mpl\n", "import pvcircuit as pvc\n", "import ipywidgets as widgets\n", + "from pvcircuit.PlotWithControls import PlotsWithControls\n", "#%matplotlib inline\n", "#import ipympl\n", "%matplotlib widget" @@ -49,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "id": "3d7dd5f8-2a35-461c-a5d7-81bceee9093e", "metadata": {}, "outputs": [], @@ -60,19 +61,19 @@ "path = pvc.datapath\n", "fileA = 'WB417n8Cdark_CZ_JA.csv'\n", "fileB = 'WB417n8Cdark_CZ_JB.csv'\n", - "WB417dark_V_dataiv = pvc.IV3T.loadcsv('WB417_V_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A) # data iv3T vs V\n", + "WB417dark_V_dataiv = pvc.IV3T.from_csv('WB417_V_dataiv',path,fileA,fileB,'V','CZ', area=A) #Iscale=1000./A) # data iv3T vs V\n", "fileA = 'WB417n8_Cpapy_CZ_JA.csv'\n", "fileB = 'WB417n8_Cpapy_CZ_JB.csv'\n", - "WB417_V_dataiv = pvc.IV3T.loadcsv('WB417_V_dataiv',path,fileA,fileB,'V','CZ', area=A) \n", + "WB417_V_dataiv = pvc.IV3T.from_csv('WB417_V_dataiv',path,fileA,fileB,'V','CZ', area=A)\n", "# data iv3T vs I\n", "fileA = 'WB417n8_Cpapy_CZ_VA.csv'\n", "fileB = 'WB417n8_Cpapy_CZ_VB.csv'\n", - "WB417_I_dataiv = pvc.IV3T.loadcsv('WB417_I_dataiv',path,fileA,fileB,'I','CZ', area=A) " + "WB417_I_dataiv = pvc.IV3T.from_csv('WB417_I_dataiv',path,fileA,fileB,'I','CZ', area=A)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "id": "814234d7-dce5-42ba-9ad5-0ae09df92658", "metadata": {}, "outputs": [], @@ -80,7 +81,7 @@ "# model\n", "WB417dev3T = pvc.Tandem3T()\n", "WB417dev3T.set(name='WB417dev3T', Rz = 2.3)\n", - "WB417dev3T.top.set(Eg=1.87, J0ratio=[ 80., 22.], Jext=0.0131, Gsh=1e-8, area=A) \n", + "WB417dev3T.top.set(Eg=1.87, J0ratio=[ 80., 22.], Jext=0.0131, Gsh=1e-8, area=A)\n", "WB417dev3T.top.RBB_dict={'method':'JFG', 'mrb':10., 'J0rb':1e-4, 'Vrb':0.}\n", "WB417dev3T.bot.set(Eg=1.419, J0ratio=[10., 15.], Jext=0.0128, Gsh= 5e-5,pn=1)\n", "WB417dev3T.bot.set(Rser=0.2, beta=5, area=A*Aratio)\n", @@ -94,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "61c3107c-ec62-45f0-8565-10dfaa064aa9", "metadata": {}, "outputs": [], @@ -107,14 +108,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "id": "8f62fafb-eeaa-4ea1-91a6-01102d3518a4", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5cfb06e09a7240ee9a7b6fffdfb55cbe", + "model_id": "8bed1f647fa546e18d4df0747f0fa1e2", "version_major": 2, "version_minor": 0 }, @@ -127,13 +128,17 @@ } ], "source": [ - "ui, Vax, Iax = WB417dev3T.controls(WB417_V_dataiv, WB417_I_dataiv, WB417dark_V_dataiv, hex=False)\n", + "# ui, Vax, Iax = WB417dev3T.controls(WB417_V_dataiv, WB417_I_dataiv, WB417dark_V_dataiv, hex=False)\n", + "# ui\n", + "\n", + "pwc = PlotsWithControls(WB417dev3T,WB417_V_dataiv, WB417_I_dataiv, WB417dark_V_dataiv, hex=False)\n", + "ui = pwc.ui\n", "ui" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "id": "e1b761f7-5d17-477f-bfa3-2e1c02e0b908", "metadata": {}, "outputs": [ @@ -160,7 +165,7 @@ " MPPCM -2.77 0.00 2.77 1.370 0.868 -2.238 -2.77 2.77 0.868 -1.370 6.20 -3.92 -0.00 2.552 1.002 " ] }, - "execution_count": 7, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -186,24 +191,24 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 18, "id": "2ee3c5be-4ecc-4532-989d-b57194608b8a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 8, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "fdc88635569f4621bf583b8d48fb74da", + "model_id": "adb3ea1a993b4d4a86e89c31ef6960ab", "version_major": 2, "version_minor": 0 }, @@ -242,14 +247,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 19, "id": "8a9a0d6d-c984-4bfb-83fb-1fa0bae64310", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "36c91f8e1e9b4b0b9691034b147a805d", + "model_id": "4c2de7ebdf5b4e0e9d2180032ef5d5bd", "version_major": 2, "version_minor": 0 }, @@ -269,9 +274,9 @@ "Lout = widgets.Output()\n", "Rout = widgets.Output()\n", "ToutBox = widgets.HBox([Lout, Rout])\n", - "with Lout: \n", + "with Lout:\n", " Tax.get_figure().show()\n", - "with Rout: \n", + "with Rout:\n", " Bax.get_figure().show()\n", "plt.ion()\n", "ToutBox" @@ -288,9 +293,9 @@ ], "metadata": { "kernelspec": { - "display_name": "pvdev", + "display_name": "Python 3", "language": "python", - "name": "pvdev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -302,7 +307,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/oldREADME.md b/oldREADME.md deleted file mode 100644 index fdd048d..0000000 --- a/oldREADME.md +++ /dev/null @@ -1,7 +0,0 @@ -# pvcircuit -• Optoelectronic models for tandem/multijunction solar cells including resistive and luminescent coupling - -• Simulation of modules composed of 2T, 3T, and 4T tandem solar cells - -• Energy yield analysis of PV systems composed of tandem solar cells - diff --git a/pvcircuit/EY.py b/pvcircuit/EY.py index 123c9bd..8ff1b7c 100644 --- a/pvcircuit/EY.py +++ b/pvcircuit/EY.py @@ -1,291 +1,731 @@ # -*- coding: utf-8 -*- """ -This is the PVcircuit Package. +This is the PVcircuit Package. pvcircuit.EY use Ripalda's Tandem proxy spectra for energy yield """ -import math #simple math import copy -from time import time +import glob +import multiprocessing as mp +import os +import warnings from functools import lru_cache -import pandas as pd #dataframes -import numpy as np #arrays -import matplotlib.pyplot as plt #plotting -from scipy.optimize import brentq #root finder -#from scipy.special import lambertw, gammaincc, gamma #special functions -from scipy.interpolate import interp1d -#from scipy.integrate import trapezoid -import scipy.constants as con #physical constants -import ipywidgets as widgets -from IPython.display import display + +import numpy as np # arrays +import pandas as pd +from parse import parse +from scipy import constants +from tqdm import tqdm, trange + import pvcircuit as pvc -from pvcircuit.junction import * -from pvcircuit.qe import * -from pvcircuit.multi2T import * -from pvcircuit.tandem3T import * -from pvcircuit.iv3T import * -import os, sys -import glob -from tandems import sandia_T, physicaliam -from pprint import pprint -# from 'Tandems' project -vectoriam = np.vectorize(physicaliam) -GITpath = os.path.dirname(pvcpath) -RIPpath = os.path.join(GITpath, 'Tandems') #assuming 'Tandems' is in parallel GitHub folders -FARMpath = os.path.join(RIPpath, 'FARMS-NIT-clustered-spectra-USA','') +warnings.warn( + "The 'EY.py' module is deprecated and will be change in future version.", + DeprecationWarning, + stacklevel=2 +) -#RIPpath = datapath.replace('/PVcircuit/data/','/Tandems/') #assuming 'Tandems' is in parallel GitHub folders -#FARMpath = RIPpath+"FARMS-NIT-clustered-spectra-USA/" #posix only +# from 'Tandems' project +# vectoriam = np.vectorize(physicaliam) +GITpath = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) +RIPpath = os.path.join(GITpath, "Tandems") # assuming 'Tandems' is in parallel GitHub folders +FARMpath = os.path.join(RIPpath, "FARMS-NIT-clustered-spectra-USA", "") -#list of data locations +# list of data locations clst_axis = glob.glob(FARMpath + "*axis.clusters.npz") -clst_tilt = glob.glob( FARMpath + "*tilt.clusters.npz") +clst_tilt = glob.glob(FARMpath + "*tilt.clusters.npz") tclst_axis = glob.glob(FARMpath + "*axis.timePerCluster.npz") -tclst_tilt = glob.glob( FARMpath + "*tilt.timePerCluster.npz") +tclst_tilt = glob.glob(FARMpath + "*tilt.timePerCluster.npz") clst_axis.sort() tclst_axis.sort() clst_tilt.sort() tclst_tilt.sort() -@lru_cache(maxsize = 100) + +@lru_cache(maxsize=100) def VMloss(type3T, bot, top, ncells): # calculates approximate loss factor for VM strings of 3T tandems if bot == 0: endloss = 0 elif top == 0: endloss = 0 - elif type3T == 'r': - endloss = (max(bot,top) - 1) - elif type3T == 's': - endloss = (bot + top - 1) - else: # not Tandem3T + elif type3T == "r": + endloss = max(bot, top) - 1 + elif type3T == "s": + endloss = bot + top - 1 + else: # not Tandem3T endloss = 0 lossfactor = 1 - endloss / ncells return lossfactor -@lru_cache(maxsize = 100) + +# @lru_cache(maxsize=100) def VMlist(mmax): # generate a list of VM configurations + 'MPP'=4T and 'CM'=2T # mmax < 10 for formating reasons - - sVM = ['MPP','CM','VM11'] - for m in range(mmax+1): - for n in range(1,m): + + sVM = ["MPP", "CM", "VM11"] + for m in range(mmax + 1): + for n in range(1, m): lcd = 2 - if m/lcd == round(m/lcd) and n/lcd == round(n/lcd): - #print(n,m, 'skip2') + if m / lcd == round(m / lcd) and n / lcd == round(n / lcd): + # print(n,m, 'skip2') continue lcd = 3 - if m/lcd == round(m/lcd) and n/lcd == round(n/lcd): - #print(n,m, 'skip3') + if m / lcd == round(m / lcd) and n / lcd == round(n / lcd): + # print(n,m, 'skip3') continue lcd = 5 - if m/lcd == round(m/lcd) and n/lcd == round(n/lcd): - #print(n,m, 'skip5') + if m / lcd == round(m / lcd) and n / lcd == round(n / lcd): + # print(n,m, 'skip5') continue - #print(n,m, 'ok') - sVM.append('VM'+str(m)+str(n)) + # print(n,m, 'ok') + sVM.append("VM" + str(m) + str(n)) return sVM - -def cellmodeldesc(model,oper): + +def sandia_T(poa_global, wind_speed, temp_air): + """ Sandia solar cell temperature model + Adapted from pvlib library to avoid using pandas dataframes + parameters used are those of 'open_rack_cell_polymerback' + """ + + a = -3.56 + b = -0.075 + deltaT = 3 + + E0 = 1000. # Reference irradiance + + temp_module = poa_global * np.exp(a + b * wind_speed) + temp_air + + temp_cell = temp_module + (poa_global / E0) * (deltaT) + + return temp_cell + +# def _calc_yield_async(i, bot, top, type3T, Jscs, Egs, TempCell, devlist, oper): +# model = devlist[i] +# if type3T == "2T": # Multi2T +# for ijunc in range(model.njuncs): +# # model.j[ijunc].set(Eg=Egs[ijunc], Jext=Jscs[i, ijunc], TC=TempCell[i]) +# model.j[ijunc].set(Eg=Egs[i,ijunc], Jext=Jscs[i, ijunc], TC=25) +# mpp_dict = model.MPP() # oper ignored for 2T +# Pmax = mpp_dict["Pmp"] +# elif type3T in ["s", "r"]: # Tandem3T +# model.top.set(Eg=Egs[i,0], Jext=Jscs[i, 0], TC=TempCell[i]) +# # model.top.set(Eg=Egs[0], Jext=Jscs[i, 0], TC=TempCell) +# model.bot.set(Eg=Egs[i,1], Jext=Jscs[i, 1], TC=TempCell[i]) +# # model.bot.set(Eg=Egs[1], Jext=Jscs[i, 1], TC=25) +# if oper == "MPP": +# tempRz = model.Rz +# model.set(Rz=0) +# iv3T = model.MPP() +# model.set(Rz=tempRz) +# elif oper == "CM": +# ln, iv3T = model.CM() +# elif oper[:2] == "VM": +# ln, iv3T = model.VM(bot, top) +# else: +# iv3T = pvc.iv3T.IV3T("bogus") +# iv3T.Ptot[0] = 0 +# Pmax = iv3T.Ptot[0] +# else: +# Pmax = 0.0 +# # outPowerMP[i] = Pmax *1e4 +# return Pmax * 1e4 + +def _calc_yield_async(bot, top, type3T, Jscs, Egs, TempCell, devlist, oper): + Pmax_out = np.zeros(len(Jscs)) + for i in range(len(Jscs)): + model = devlist[i] + if type3T == "2T": # Multi2T + for ijunc in range(model.njuncs): + # model.j[ijunc].set(Eg=Egs[ijunc], Jext=Jscs[i, ijunc], TC=TempCell[i]) + model.j[ijunc].set(Eg=Egs[i,ijunc], Jext=Jscs[i, ijunc], TC=25) + mpp_dict = model.MPP() # oper ignored for 2T + Pmax = mpp_dict["Pmp"] + elif type3T in ["s", "r"]: # Tandem3T + model.top.set(Eg=Egs[i,0], Jext=Jscs[i, 0], TC=TempCell.iloc[i]) + # model.top.set(Eg=Egs[0], Jext=Jscs[i, 0], TC=TempCell) + model.bot.set(Eg=Egs[i,1], Jext=Jscs[i, 1], TC=TempCell.iloc[i]) + # model.bot.set(Eg=Egs[1], Jext=Jscs[i, 1], TC=25) + if oper == "MPP": + tempRz = model.Rz + model.set(Rz=0) + iv3T = model.MPP() + model.set(Rz=tempRz) + elif oper == "CM": + ln, iv3T = model.CM() + elif oper[:2] == "VM": + ln, iv3T = model.VM(bot, top) + else: + iv3T = pvc.iv3T.IV3T("bogus") + iv3T.Ptot[0] = 0 + Pmax = iv3T.Ptot[0] + else: + Pmax = 0.0 + # outPowerMP[i] = Pmax *1e4 + Pmax_out[i] = Pmax * 1e4 + + return Pmax_out + +def cellmodeldesc(model, oper): # return description of model and operation # cell 'model' can be 'Multi2T' or 'Tandem3T' #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' - #Outputs (bot, top, ratio, type3T) + # Outputs (bot, top, ratio, type3T) - #loss = 1. + # loss = 1. bot = 0 top = 0 - type3T = '' + type3T = "" - if isinstance(model,pvc.multi2T.Multi2T): - type3T = '2T' - elif isinstance(model,pvc.tandem3T.Tandem3T): + if isinstance(model, pvc.multi2T.Multi2T): + type3T = "2T" + elif isinstance(model, pvc.tandem3T.Tandem3T): if model.top.pn == model.bot.pn: - type3T = 'r' + type3T = "r" else: - type3T = 's' - - if oper == 'MPP': - ratio = -0.5 - elif oper == 'CM': + type3T = "s" + + if oper == "MPP": + ratio = -1.0 + elif oper == "CM": ratio = 0 - elif oper[:2] == 'VM': - bot, top = parse('VM{:1d}{:1d}',oper) - #loss = VMloss(type3T, bot, top, ncells) - ratio = bot/top + elif oper[:2] == "VM": + bot, top = parse("VM{:1d}{:1d}", oper) + # loss = VMloss(type3T, bot, top, ncells) + ratio = bot / top else: - print(oper+' not valid') + print(oper + " not valid") ratio = np.nan else: - print('unknown model' + str(type(model))) + print("unknown model" + str(type(model))) ratio = np.nan - type3T = '' + type3T = "" return bot, top, ratio, type3T - + class TMY(object): - ''' - typical meterological year at a specific location - ''' - + """ + typical meterological year at a specific location + """ + def __init__(self, i, tilt=False): - + if not tilt: - #Boulder i=497 + # Boulder i=497 clst = clst_axis tclst = tclst_axis else: - #Boulder i=491 + # Boulder i=491 clst = clst_tilt tclst = tclst_tilt - - self.tilt=tilt + + self.tilt = tilt self.index = i - head, tail = os.path.split(clst[i]) - self.name = tail.replace('.clusters.npz','') - #self.name = clst[i].split("/")[-1][:-13] #posix only - self.longitude = float(self.name.split('_')[1]) - self.latitude = float(self.name.split('_')[0]) - self.altitude = float(self.name.split('_')[2]) - self.zone = float(self.name.split('_')[3]) - + _, tail = os.path.split(clst[i]) + self.name = tail.replace(".clusters.npz", "") + # self.name = clst[i].split("/")[-1][:-13] #posix only + self.longitude = float(self.name.split("_")[1]) + self.latitude = float(self.name.split("_")[0]) + self.altitude = float(self.name.split("_")[2]) + self.zone = float(self.name.split("_")[3]) + d1 = np.load(clst[i]) td1 = np.load(tclst[i]) - arr_0 = d1['arr_0'] - tarr_0 = td1['arr_0'] - - spec = arr_0[0,154:172,:] - tspec = tarr_0[0,154:172] - - self.Temp = spec[:,1].copy() * 1e6 #C - self.Wind = spec[:,2].copy() * 1e6 #m/s - self.DayTime = arr_0[0,0,-1].copy() * 24# scalar - self.NTime = tspec # Fraction of 1 - + arr_0 = d1["arr_0"] + tarr_0 = td1["arr_0"] + + spec = arr_0[0, 154:172, :] + tspec = tarr_0[0, 154:172] + + self.Temp = spec[:, 1].copy() * 1e6 # C + self.Wind = spec[:, 2].copy() * 1e6 # m/s + self.DayTime = arr_0[0, 0, -1].copy() * 24 # scalar + self.NTime = tspec # Fraction of 1 + aoi = spec[:, 5] * 1e6 self.Angle = np.array(aoi.tolist()) - aim = vectoriam(aoi) -# aim = physicaliam(aoi) - self.AngleMOD = np.array(aim.tolist()) - - spec[:,:5] = 0 - spec[:,-1] = 0 - self.Irradiance = np.array(spec.tolist()).transpose() #transpose for integration with QE - - #calculate from spectral proxy data only - self.SpecPower = np.trapz(self.Irradiance, x=wvl, axis=0) # optical power of each spectrum - self.RefPower = np.trapz(pvc.qe.refspec, x=wvl, axis=0) # optical power of each reference spectrum - #self.SpecPower = PintMD(self.Irradiance) - #self.RefPower = PintMD(pvc.qe.refspec) + # aim = vectoriam(aoi) + # aim = physicaliam(aoi) + # self.AngleMOD = np.array(aim.tolist()) + + spec[:, :5] = 0 + spec[:, -1] = 0 + self.Irradiance = np.array(spec.tolist()).transpose() # transpose for integration with QE + + # standard data + pvcpath = os.path.dirname(os.path.dirname(__file__)) + datapath = os.path.join(pvcpath, "data", "") # Data files here + # datapath = os.path.abspath(os.path.relpath('../data/', start=__file__)) + # datapath = pvcpath.replace('/pvcircuit','/data/') + ASTMfile = os.path.join(datapath, "ASTMG173.csv") + dfrefspec = pd.read_csv(ASTMfile, index_col=0, header=2) + + self.ref_wvl = dfrefspec.index.to_numpy(dtype=np.float64, copy=True) + + # calculate from spectral proxy data only + self.SpecPower = np.trapz(self.Irradiance, x=self.ref_wvl, axis=0) # optical power of each spectrum + self.RefPower = np.trapz(pvc.qe.refspec, x=self.ref_wvl, axis=0) # optical power of each reference spectrum + # self.SpecPower = PintMD(self.Irradiance) + # self.RefPower = PintMD(pvc.qe.refspec) self.TempCell = sandia_T(self.SpecPower, self.Wind, self.Temp) self.inPower = self.SpecPower * self.NTime # spectra power*(fractional time) - self.YearlyEnergy = self.inPower.sum() * self.DayTime * 365.25 / 1000 #kWh/m2/yr - - def cellbandgaps(self,EQE,TC=25): + self.YearlyEnergy = self.inPower.sum() * self.DayTime * 365.25 / 1000 # kWh/m2/yr + + self.outPower = np.empty_like(self.inPower) # initialize outPower + + self.Jdbs = None + self.Egs = None + self.JscSTCs = None + self.Jscs = None + + def cellbandgaps(self, EQE, TC=25): # subcell Egs for a given EQE class - self.Jdbs, self.Egs = EQE.Jdb(TC) #Eg from EQE same at all temperatures + self.Jdbs, self.Egs = EQE.Jdb(TC) # Eg from EQE same at all temperatures - def cellcurrents(self,EQE,STC=False): + def cellcurrents(self, EQE, STC=False): # subcell currents and Egs and under self TMY for a given EQE class - - #self.JscSTCs = JintMD(EQE, xEQE, pvc.qe.refspec)/1000. - #self.Jscs = JintMD(EQE, xEQE, self.Irradiance) /1000. + + # self.JscSTCs = JintMD(EQE, xEQE, pvc.qe.refspec)/1000. + # self.Jscs = JintMD(EQE, xEQE, self.Irradiance) /1000. if STC: - self.JscSTCs = EQE.Jint(pvc.qe.refspec)/1000. + self.JscSTCs = EQE.Jint(pvc.qe.refspec) / 1000.0 else: - self.Jscs = EQE.Jint(self.Irradiance) /1000. - - def cellSTCeff(self,model,oper,iref=1): + self.Jscs = EQE.Jint(self.Irradiance) / 1000.0 + + def cellSTCeff(self, model, oper, iref=1): # max power of a cell under a reference spectrum # self.Jscs and self.Egs must be calculate first using cellcurrents - #Inputs + # Inputs # cell 'model' can be 'Multi2T' or 'Tandem3T' #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' # iref = 0 -> space # iref = 1 -> global # iref = 2 -> direct - #Outputs - #- STCeff efficiency of cell under reference spectrum (space,global,direct) - - bot, top, ratio, type3T= cellmodeldesc(model,oper) #ncells does not matter here - - #calc reference spectra efficiency + # Outputs + # - STCeff efficiency of cell under reference spectrum (space,global,direct) + + bot, top, _, type3T = cellmodeldesc(model, oper) # ncells does not matter here + + # calc reference spectra efficiency if iref == 0: - Tref = 28. #space + Tref = 28.0 # space else: - Tref = 25. #global and direct - - if type3T == '2T': #Multi2T + Tref = 25.0 # global and direct + + if type3T == "2T": # Multi2T for ijunc in range(model.njuncs): - model.j[ijunc].set(Eg=self.Egs[ijunc], Jext=self.JscSTCs[iref,ijunc], TC=Tref) - mpp_dict=model.MPP() #oper ignored for 2T - Pmax = mpp_dict['Pmp'] * 10. - ratio = 0. - elif type3T in ['s','r']: #Tandem3T - model.top.set(Eg=self.Egs[0], Jext=self.JscSTCs[iref,0], TC=Tref) - model.bot.set(Eg=self.Egs[1], Jext=self.JscSTCs[iref,1], TC=Tref) - if oper == 'MPP': + model.j[ijunc].set(Eg=self.Egs[ijunc], Jext=self.JscSTCs[iref, ijunc], TC=Tref) + mpp_dict = model.MPP() # oper ignored for 2T + Pmax = mpp_dict["Pmp"] * 10.0 + elif type3T in ["s", "r"]: # Tandem3T + model.top.set(Eg=self.Egs[0], Jext=self.JscSTCs[iref, 0], TC=Tref) + model.bot.set(Eg=self.Egs[1], Jext=self.JscSTCs[iref, 1], TC=Tref) + if oper == "MPP": iv3T = model.MPP() - elif oper == 'CM': - ln, iv3T = model.CM() - elif oper[:2] == 'VM': - ln, iv3T = model.VM(bot,top) + elif oper == "CM": + _, iv3T = model.CM() + elif oper[:2] == "VM": + _, iv3T = model.VM(bot, top) else: - print(oper+' not valid') - iv3T = IV3T('bogus') + print(oper + " not valid") + iv3T = pvc.iv3T.IV3T("bogus") iv3T.Ptot[0] = 0 - Pmax = iv3T.Ptot[0] * 10. + Pmax = iv3T.Ptot[0] * 10.0 else: - Pmax = 0. - - STCeff = Pmax * 1000. / self.RefPower[iref] + Pmax = 0.0 + + STCeff = Pmax * 1000.0 / self.RefPower[iref] return STCeff - - def cellEYeff(self,model,oper): + + def cellEYeff(self, model, oper): # max power of a cell under self TMY # self.Jscs and self.Egs must be calculate first using cellcurrents - #Inputs + # Inputs # cell 'model' can be 'Multi2T' or 'Tandem3T' #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' - #Outputs - #- EYeff energy yield efficiency = EY/YearlyEnergy - #- EY energy yield of cell [kWh/m2/yr] - - bot, top, ratio, type3T = cellmodeldesc(model,oper) #ncells does not matter here + # Outputs + # - EYeff energy yield efficiency = EY/YearlyEnergy + # - EY energy yield of cell [kWh/m2/yr] + + bot, top, _, type3T = cellmodeldesc(model, oper) # ncells does not matter here # calc EY, etc - self.outPower = np.empty_like(self.inPower) #initialize - for i in range(len(self.outPower)): - if type3T == '2T': #Multi2T + for i in trange(len(self.inPower), leave=True, desc='single core'): + if type3T == "2T": # Multi2T for ijunc in range(model.njuncs): - model.j[ijunc].set(Eg=self.Egs[ijunc], Jext=self.Jscs[i,ijunc], TC=self.TempCell[i]) - mpp_dict=model.MPP() #oper ignored for 2T - Pmax = mpp_dict['Pmp'] - elif type3T in ['s','r']: #Tandem3T - model.top.set(Eg=self.Egs[0], Jext=self.Jscs[i,0], TC=self.TempCell[i]) - model.bot.set(Eg=self.Egs[1], Jext=self.Jscs[i,1], TC=self.TempCell[i]) - if oper == 'MPP': + model.j[ijunc].set(Eg=self.Egs[ijunc], Jext=self.Jscs[i, ijunc], TC=self.TempCell.iloc[i]) + mpp_dict = model.MPP() # oper ignored for 2T + Pmax = mpp_dict["Pmp"] + elif type3T in ["s", "r"]: # Tandem3T + model.top.set(Eg=self.Egs[0], Jext=self.Jscs[i, 0], TC=self.TempCell[i]) + model.bot.set(Eg=self.Egs[1], Jext=self.Jscs[i, 1], TC=self.TempCell[i]) + if oper == "MPP": iv3T = model.MPP() - elif oper == 'CM': - ln, iv3T = model.CM() - elif oper[:2] == 'VM': - ln, iv3T = model.VM(bot,top) + elif oper == "CM": + _, iv3T = model.CM() + elif oper[:2] == "VM": + _, iv3T = model.VM(bot, top) else: - iv3T = IV3T('bogus') + iv3T = pvc.iv3T.IV3T("bogus") iv3T.Ptot[0] = 0 Pmax = iv3T.Ptot[0] else: - Pmax = 0. + Pmax = 0.0 - self.outPower[i] = Pmax * self.NTime[i] * 10000. + self.outPower[i] = Pmax * self.NTime[i] * 10000.0 - EY = sum(self.outPower) * self.DayTime * 365.25/1000 #kWh/m2/yr + EY = sum(self.outPower) * self.DayTime * 365.25 / 1000 # kWh/m2/yr EYeff = EY / self.YearlyEnergy - + return EY, EYeff + + + +class Meteo(object): + """ + Meteorological environmental data and spectra + """ + + def __init__(self, wavelength, spectra, ambient_temperature, wind, daytime): + + self.temp = ambient_temperature # [degC] + self.wind = wind # [m/s] + self.daytime = daytime # daytime vector + + self.wavelength = wavelength + self.spectra = spectra # transpose for integration with QE + + + # standard data + pvcpath = os.path.dirname(os.path.dirname(__file__)) + datapath = os.path.join(pvcpath, "data", "") # Data files here + # datapath = os.path.abspath(os.path.relpath('../data/', start=__file__)) + # datapath = pvcpath.replace('/pvcircuit','/data/') + ASTMfile = os.path.join(datapath, "ASTMG173.csv") + dfrefspec = pd.read_csv(ASTMfile, index_col=0, header=2) + + self.ref_wvl = dfrefspec.index.to_numpy(dtype=np.float64, copy=True) + + # calculate from spectral proxy data only + self.SpecPower = pd.Series(np.trapz(spectra, x=wavelength), index=spectra.index) # optical power of each spectrum + self.RefPower = np.trapz(pvc.qe.refspec, x=self.ref_wvl, axis=0) # optical power of each reference spectrum + self.TempCell = sandia_T(self.SpecPower, self.wind, self.temp) + self.inPower = self.SpecPower # * self.NTime # spectra power*(fractional time) + self.outPower = None + # construct a results dataframe for better handling + self.models=[] + self.operation_modes=[] + self.tandem_types=[] + self.EnergyIn = np.trapz(self.SpecPower, self.daytime.values.astype(np.int64)) / 1e9 / 60 # kWh/m2/yr + + self.average_photon_energy = None # is calcluated when running calc_ape + + def cellbandgaps(self, EQE, TC=25): + # subcell Egs for a given EQE class + self.Jdbs, self.Egs = EQE.Jdb(TC) # Eg from EQE same at all temperatures + + def cellcurrents(self, EQE, STC=False): + # subcell currents and Egs and under self TMY for a given EQE class + + if STC: + self.JscSTCs = EQE.Jint(pvc.qe.refspec) / 1000.0 + else: + self.Jscs = EQE.Jint(self.spectra.T, xspec=self.wavelength) / 1000.0 + + def cellSTCeff(self, model, oper, iref=1): + # max power of a cell under a reference spectrum + # self.Jscs and self.Egs must be calculate first using cellcurrents + # Inputs + # cell 'model' can be 'Multi2T' or 'Tandem3T' + #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' + # iref = 0 -> space + # iref = 1 -> global + # iref = 2 -> direct + # Outputs + # - STCeff efficiency of cell under reference spectrum (space,global,direct) + + bot, top, ratio, type3T = cellmodeldesc(model, oper) # ncells does not matter here + + # calc reference spectra efficiency + if iref == 0: + Tref = 28.0 # space + else: + Tref = 25.0 # global and direct + + if type3T == "2T": # Multi2T + for ijunc in range(model.njuncs): + model.j[ijunc].set(TC=Tref) + mpp_dict = model.MPP() # oper ignored for 2T + Pmax = mpp_dict["Pmp"] * 10.0 + ratio = 0.0 + elif type3T in ["s", "r"]: # Tandem3T + model.top.set(TC=Tref) + model.bot.set(TC=Tref) + if oper == "MPP": + tempRz = model.Rz + model.set(Rz=0) + iv3T = model.MPP() + model.set(Rz=tempRz) + + elif oper == "CM": + ln, iv3T = model.CM() + elif oper[:2] == "VM": + ln, iv3T = model.VM(bot, top) + else: + print(oper + " not valid") + iv3T = pvc.iv3T.IV3T("bogus") + iv3T.Ptot[0] = 0 + Pmax = iv3T.Ptot[0] * 10.0 + else: + Pmax = 0.0 + + STCeff = Pmax * 1000.0 / self.RefPower[iref] + + return STCeff + + def cellEYeff(self, model, oper): + # max power of a cell under self TMY + # self.Jscs and self.Egs must be calculate first using cellcurrents + # Inputs + # cell 'model' can be 'Multi2T' or 'Tandem3T' + #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' + # Outputs + # - EYeff energy yield efficiency = EY/YearlyEnergy + # - EY energy yield of cell [kWh/m2/yr] + + bot, top, ratio, type3T = cellmodeldesc(model, oper) # ncells does not matter here + + # calc EY, etc + outPower = np.empty((self.inPower.shape[0],1)) # initialize + + for i in trange(len(outPower)): + + if type3T == "2T": # Multi2T + for ijunc in range(model.njuncs): + model.j[ijunc].set(Eg=self.Egs[i, ijunc], Jext=self.Jscs[i, ijunc], TC=self.TempCell.iloc[i]) + mpp_dict = model.MPP() # oper ignored for 2T + Pmax = mpp_dict["Pmp"] + elif type3T in ["s", "r"]: # Tandem3T + model.top.set(Eg=self.Egs[i, 0], Jext=self.Jscs[i, 0], TC=self.TempCell.iloc[i]) + model.bot.set(Eg=self.Egs[i, 1], Jext=self.Jscs[i, 1], TC=self.TempCell.iloc[i]) + if oper == "MPP": + tempRz = model.Rz + model.set(Rz=0) + iv3T = model.MPP() + model.set(Rz=tempRz) + elif oper == "CM": + ln, iv3T = model.CM() + elif oper[:2] == "VM": + ln, iv3T = model.VM(bot, top) + else: + iv3T = pvc.iv3T.IV3T("bogus") + iv3T.Ptot[0] = 0 + Pmax = iv3T.Ptot[0] + else: + Pmax = 0.0 + + outPower[i] = Pmax * 10000 + + if self.outPower is None: + self.outPower = outPower + elif self.outPower.shape[0] == outPower.shape[0]: + self.outPower = np.concatenate([self.outPower, outPower], axis=1) + + self.models.append(model) + self.operation_modes.append(oper) + self.tandem_types.append(type3T) + + # EnergyOut = np.trapz(self.outPower, self.daytime.values.astype(int)) / 1e9 / 60 # kWh/m2/yr + EnergyOut = np.trapz(outPower, self.daytime.values.astype(np.int64), axis=0) / 1e9 / 60 # kWh/m2/yr + EYeff = EnergyOut / self.EnergyIn + + return EnergyOut, EYeff + + # def cellEYeffMP(self, model, oper): + # # max power of a cell under self TMY + # # self.Jscs and self.Egs must be calculate first using cellcurrents + # # Inputs + # # cell 'model' can be 'Multi2T' or 'Tandem3T' + # #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' + # # Outputs + # # - EYeff energy yield efficiency = EY/YearlyEnergy + # # - EY energy yield of cell [kWh/m2/yr] + + # bot, top, ratio, type3T = cellmodeldesc(model, oper) # ncells does not matter here + + # # calc EY, etc + # outPowerMP = np.empty_like(self.inPower) # initialize + + # cpu_count = mp.cpu_count() + # print(f"running multiprocess with {cpu_count} pools") + # with tqdm(total=len(self.inPower), leave=True, desc = f"Multi processing {oper}") as pbar: + + # dev_list = [copy.deepcopy(model) for _ in range(len(self.Jscs))] + # with mp.Pool(cpu_count) as pool: + # def callback(*args): + # # callback + # pbar.update() + # return + + # results = list( + # pool.apply_async(_calc_yield_async, args=(i, bot, top, type3T, self.Jscs, self.Egs, self.TempCell, dev_list, oper), callback=callback) + # for i, _ in enumerate(self.inPower) + # ) + # results = [r.get() for r in results] + + # self.outPowerMP = results + + # EnergyOut = np.trapz(self.outPowerMP, self.daytime.values.astype(np.int64)) / 1e9 / 60 # kWh/m2/yr + # EYeff = EnergyOut / self.EnergyIn + # return EnergyOut, EYeff + + def cellEYeffMP(self, model, oper): + # max power of a cell under self TMY + # self.Jscs and self.Egs must be calculate first using cellcurrents + # Inputs + # cell 'model' can be 'Multi2T' or 'Tandem3T' + #'oper' describes operation method unconstrained 'MPP', series-connected 'CM', parallel-configurations 'VM' + # Outputs + # - EYeff energy yield efficiency = EY/YearlyEnergy + # - EY energy yield of cell [kWh/m2/yr] + + bot, top, ratio, type3T = cellmodeldesc(model, oper) # ncells does not matter here + + # calc EY, etc + outPowerMP = np.empty_like(self.inPower) # initialize + + # Split data into chunks for workers + max_chunk_size = 200 + cpu_count = mp.cpu_count() + chunk_ids = np.arange(len(self.Jscs)) + chunk_size = min(len(chunk_ids) // cpu_count, max_chunk_size) + + chunks = [chunk_ids[i:i + chunk_size] for i in range(0, len(chunk_ids), chunk_size)] + + print(f"running multiprocess with {cpu_count} pools") + with tqdm(total=len(self.inPower), leave=True, desc = f"Multi processing {oper}") as pbar: + + dev_list = np.array([copy.deepcopy(model) for _ in range(len(self.Jscs))]) + with mp.Pool(cpu_count) as pool: + def callback(*args): + # callback + pbar.update(len(args[0])) + return + + # Assign tasks to workers + jobs = [pool.apply_async(_calc_yield_async, args=(bot, top, type3T, self.Jscs[chunk], self.Egs[chunk], self.TempCell.iloc[chunk], dev_list[chunk], oper), callback=callback) for chunk in chunks] + # Get results from workers + results = [item for job in jobs for item in job.get()] + + self.outPowerMP = results + + EnergyOut = np.trapz(self.outPowerMP, self.daytime.values.astype(np.int64)) / 1e9 / 60 # kWh/m2/yr + EYeff = EnergyOut / self.EnergyIn + return EnergyOut, EYeff + + + def calc_ape(self): + """ + Calcualtes the average photon energy (APE) of the spectra + """ + + phi = self.spectra * (self.wavelength * 1e-9) / constants.h / constants.c + self.average_photon_energy = np.trapz(x=self.wavelength, y=self.spectra.values) / constants.e / np.trapz(x=self.wavelength, y=phi.values) + + + def filter_ape(self, min_ape:float = 0, max_ape:float = 10): + """ + filter the average photon energy (APE) + + Args: + min_ape (float, optional): min value of th APE. Defaults to 0. + max_ape (float, optional): max value of the APE. Defaults to 10. + """ + if self.average_photon_energy is None: + self.calc_ape() + + self_copy = copy.deepcopy(self) + ape_mask = (self_copy.average_photon_energy > min_ape) & (self_copy.average_photon_energy < max_ape) + + self_copy.daytime = self_copy.daytime[ape_mask] + self_copy.average_photon_energy = self_copy.average_photon_energy[ape_mask] + self_copy.spectra = self_copy.spectra[ape_mask] + self_copy.SpecPower = self_copy.SpecPower[ape_mask] + self_copy.TempCell = self_copy.TempCell[ape_mask] + + assert len(self_copy.spectra) == len(self_copy.SpecPower) == len(self_copy.TempCell) == len(self_copy.average_photon_energy) + return self_copy + + + + def filter_spectra(self, min_spectra:float = 0, max_spectra:float = 10): + """ + spectral data + + Args: + min_spectra (float, optional): min value of the spectra. Defaults to 0. + max_spectra (float, optional): max value of the spectra. Defaults to 10. + """ + + + self_copy = copy.deepcopy(self) + spectra_mask = (self_copy.spectra >= min_spectra).all(axis=1) & (self_copy.spectra < max_spectra).all(axis=1) + self_copy.daytime = self_copy.daytime[spectra_mask] + self_copy.average_photon_energy = self_copy.average_photon_energy[spectra_mask] + self_copy.spectra = self_copy.spectra[spectra_mask] + self_copy.SpecPower = self_copy.SpecPower[spectra_mask] + self_copy.TempCell = self_copy.TempCell[spectra_mask] + + assert len(self.spectra) == len(self.SpecPower) == len(self.TempCell) == len(self.average_photon_energy) + return self_copy + + + + + def filter_custom(self, filter_array:bool): + """ + Applys a custom filter ot the meteo data + Args: + filter_array (bool): Filter array to apply to the data + """ + # assert len(filter_array) == len(self.spectra) == len(self.SpecPower) == len(self.TempCell) + + + self_copy = copy.deepcopy(self) + + # self_copy.average_photon_energy = self_copy.average_photon_energy[filter_array] + # self_copy.spectra = self_copy.spectra[filter_array] + # self_copy.SpecPower = self_copy.SpecPower[filter_array] + # self_copy.TempCell = self_copy.TempCell[filter_array] + + for attr_name in vars(self): + if hasattr(getattr(self_copy, attr_name), '__len__'): + attr = getattr(self_copy, attr_name) + if len(attr) == len(filter_array): + setattr(self_copy,attr_name,attr[filter_array]) + + + # assert len(self.spectra) == len(self.SpecPower) == len(self.TempCell) == len(self.average_photon_energy) + return self_copy + + def reindex(self, index:bool, method="nearest", tolerance=pd.Timedelta(seconds=30)): + """ + Reindex according to indexer + Args: + filter_array (bool): Filter array to apply to the data + """ + + self_copy = copy.deepcopy(self) + + for attr_name in dir(self): + attr = getattr(self, attr_name) + if isinstance(attr, pd.DataFrame) or isinstance(attr, pd.Series): + setattr(self_copy,attr_name,attr.reindex(index=index, method=method, tolerance=tolerance)) + + + return self_copy diff --git a/pvcircuit/data/ASTMG173.csv b/pvcircuit/data/ASTMG173.csv new file mode 100644 index 0000000..ca25c86 --- /dev/null +++ b/pvcircuit/data/ASTMG173.csv @@ -0,0 +1,2005 @@ +#ASTM G173-03 Reference Spectra Derived from SMARTS v. 2.9.2,,, +#Wvlgth nm,Etr W*m-2*nm-1,Global tilt W*m-2*nm-1,Direct+circumsolar W*m-2*nm-1 +nm,space,global,direct +280,8.20E-02,4.73E-23,2.54E-26 +280.5,9.90E-02,1.23E-21,1.09E-24 +281,1.50E-01,5.69E-21,6.13E-24 +281.5,2.12E-01,1.57E-19,2.75E-22 +282,2.67E-01,1.19E-18,2.83E-21 +282.5,3.03E-01,4.54E-18,1.33E-20 +283,3.25E-01,1.85E-17,6.76E-20 +283.5,3.23E-01,3.54E-17,1.46E-19 +284,2.99E-01,7.27E-16,4.98E-18 +284.5,2.50E-01,2.49E-15,2.16E-17 +285,1.76E-01,8.01E-15,9.00E-17 +285.5,1.55E-01,4.26E-14,6.44E-16 +286,2.42E-01,1.37E-13,2.35E-15 +286.5,3.33E-01,8.38E-13,1.85E-14 +287,3.62E-01,2.74E-12,7.25E-14 +287.5,3.39E-01,1.09E-11,3.66E-13 +288,3.11E-01,6.23E-11,2.81E-12 +288.5,3.25E-01,1.72E-10,9.07E-12 +289,3.92E-01,5.63E-10,3.50E-11 +289.5,4.79E-01,2.07E-09,1.54E-10 +290,5.63E-01,6.02E-09,5.15E-10 +290.5,6.06E-01,1.38E-08,1.33E-09 +291,6.18E-01,3.51E-08,3.90E-09 +291.5,5.98E-01,1.09E-07,1.44E-08 +292,5.67E-01,2.68E-07,4.08E-08 +292.5,5.29E-01,4.27E-07,7.04E-08 +293,5.38E-01,8.65E-07,1.58E-07 +293.5,5.49E-01,2.27E-06,4.71E-07 +294,5.33E-01,4.17E-06,9.46E-07 +294.5,5.20E-01,6.59E-06,1.60E-06 +295,5.27E-01,1.23E-05,3.22E-06 +295.5,5.59E-01,2.78E-05,8.02E-06 +296,5.73E-01,4.79E-05,1.47E-05 +296.5,5.21E-01,7.13E-05,2.33E-05 +297,4.78E-01,9.68E-05,3.32E-05 +297.5,5.29E-01,1.86E-04,6.79E-05 +298,5.28E-01,2.90E-04,1.11E-04 +298.5,4.68E-01,3.58E-04,1.43E-04 +299,4.72E-01,4.92E-04,2.03E-04 +299.5,5.01E-01,8.61E-04,3.74E-04 +300,4.58E-01,1.02E-03,4.56E-04 +300.5,4.33E-01,1.25E-03,5.72E-04 +301,4.63E-01,1.93E-03,9.19E-04 +301.5,4.78E-01,2.69E-03,1.32E-03 +302,4.49E-01,2.92E-03,1.46E-03 +302.5,5.08E-01,4.28E-03,2.19E-03 +303,6.12E-01,7.09E-03,3.73E-03 +303.5,6.46E-01,8.98E-03,4.80E-03 +304,6.21E-01,9.47E-03,5.10E-03 +304.5,6.26E-01,1.20E-02,6.47E-03 +305,6.42E-01,1.65E-02,8.93E-03 +305.5,6.11E-01,1.87E-02,1.02E-02 +306,5.65E-01,1.86E-02,1.02E-02 +306.5,5.75E-01,2.11E-02,1.16E-02 +307,6.05E-01,2.78E-02,1.52E-02 +307.5,6.31E-01,3.56E-02,1.95E-02 +308,6.45E-01,3.78E-02,2.08E-02 +308.5,6.41E-01,4.14E-02,2.28E-02 +309,5.80E-01,4.05E-02,2.23E-02 +309.5,5.00E-01,4.33E-02,2.37E-02 +310,5.33E-01,5.09E-02,2.78E-02 +310.5,6.52E-01,6.55E-02,3.59E-02 +311,7.62E-01,8.29E-02,4.54E-02 +311.5,7.44E-01,8.41E-02,4.62E-02 +312,7.06E-01,9.34E-02,5.09E-02 +312.5,6.76E-01,9.90E-02,5.38E-02 +313,6.94E-01,1.07E-01,5.83E-02 +313.5,7.24E-01,1.08E-01,5.90E-02 +314,7.17E-01,1.20E-01,6.53E-02 +314.5,6.76E-01,1.31E-01,7.05E-02 +315,6.85E-01,1.36E-01,7.37E-02 +315.5,6.32E-01,1.18E-01,6.48E-02 +316,5.87E-01,1.23E-01,6.71E-02 +316.5,6.49E-01,1.50E-01,8.11E-02 +317,7.39E-01,1.72E-01,9.30E-02 +317.5,8.02E-01,1.82E-01,9.97E-02 +318,7.24E-01,1.76E-01,9.58E-02 +318.5,6.80E-01,1.86E-01,1.00E-01 +319,7.06E-01,2.05E-01,1.10E-01 +319.5,7.33E-01,1.96E-01,1.07E-01 +320,7.75E-01,2.05E-01,1.13E-01 +320.5,8.26E-01,2.45E-01,1.33E-01 +321,7.65E-01,2.50E-01,1.34E-01 +321.5,7.19E-01,2.38E-01,1.28E-01 +322,7.35E-01,2.22E-01,1.22E-01 +322.5,7.12E-01,2.17E-01,1.20E-01 +323,6.49E-01,2.12E-01,1.16E-01 +323.5,6.81E-01,2.49E-01,1.34E-01 +324,7.41E-01,2.75E-01,1.49E-01 +324.5,7.88E-01,2.83E-01,1.55E-01 +325,8.29E-01,2.79E-01,1.55E-01 +325.5,9.14E-01,3.24E-01,1.79E-01 +326,9.98E-01,3.81E-01,2.09E-01 +326.5,1.02E+00,4.07E-01,2.22E-01 +327,1.00E+00,3.98E-01,2.18E-01 +327.5,9.87E-01,3.85E-01,2.13E-01 +328,9.57E-01,3.51E-01,1.98E-01 +328.5,9.34E-01,3.72E-01,2.07E-01 +329,1.00E+00,4.22E-01,2.33E-01 +329.5,1.10E+00,4.69E-01,2.59E-01 +330,1.11E+00,4.71E-01,2.62E-01 +330.5,1.04E+00,4.28E-01,2.41E-01 +331,9.91E-01,4.03E-01,2.28E-01 +331.5,9.94E-01,4.18E-01,2.36E-01 +332,9.93E-01,4.36E-01,2.45E-01 +332.5,9.80E-01,4.39E-01,2.47E-01 +333,9.64E-01,4.29E-01,2.43E-01 +333.5,9.37E-01,4.07E-01,2.33E-01 +334,9.56E-01,4.15E-01,2.38E-01 +334.5,9.89E-01,4.45E-01,2.54E-01 +335,1.01E+00,4.64E-01,2.65E-01 +335.5,9.75E-01,4.53E-01,2.59E-01 +336,8.90E-01,4.15E-01,2.38E-01 +336.5,8.29E-01,3.82E-01,2.21E-01 +337,8.18E-01,3.74E-01,2.18E-01 +337.5,8.77E-01,4.01E-01,2.34E-01 +338,9.25E-01,4.34E-01,2.53E-01 +338.5,9.58E-01,4.55E-01,2.65E-01 +339,9.69E-01,4.64E-01,2.71E-01 +339.5,9.89E-01,4.74E-01,2.78E-01 +340,1.05E+00,5.02E-01,2.97E-01 +340.5,1.05E+00,5.01E-01,2.97E-01 +341,9.71E-01,4.71E-01,2.79E-01 +341.5,9.59E-01,4.69E-01,2.79E-01 +342,9.96E-01,4.89E-01,2.91E-01 +342.5,1.03E+00,5.08E-01,3.03E-01 +343,1.04E+00,5.15E-01,3.09E-01 +343.5,9.83E-01,4.86E-01,2.92E-01 +344,8.54E-01,4.18E-01,2.54E-01 +344.5,8.13E-01,4.03E-01,2.44E-01 +345,9.16E-01,4.59E-01,2.79E-01 +345.5,9.70E-01,4.89E-01,2.98E-01 +346,9.43E-01,4.78E-01,2.91E-01 +346.5,9.56E-01,4.87E-01,2.97E-01 +347,9.70E-01,4.94E-01,3.03E-01 +347.5,9.33E-01,4.77E-01,2.94E-01 +348,9.25E-01,4.75E-01,2.93E-01 +348.5,9.37E-01,4.83E-01,2.99E-01 +349,8.99E-01,4.66E-01,2.89E-01 +349.5,9.20E-01,4.78E-01,2.97E-01 +350,1.01E+00,5.28E-01,3.29E-01 +350.5,1.08E+00,5.67E-01,3.55E-01 +351,1.05E+00,5.52E-01,3.46E-01 +351.5,1.01E+00,5.30E-01,3.34E-01 +352,9.84E-01,5.18E-01,3.27E-01 +352.5,9.26E-01,4.90E-01,3.10E-01 +353,9.80E-01,5.20E-01,3.30E-01 +353.5,1.08E+00,5.72E-01,3.64E-01 +354,1.13E+00,6.05E-01,3.85E-01 +354.5,1.14E+00,6.12E-01,3.90E-01 +355,1.14E+00,6.11E-01,3.91E-01 +355.5,1.10E+00,5.90E-01,3.79E-01 +356,1.03E+00,5.54E-01,3.56E-01 +356.5,9.59E-01,5.19E-01,3.35E-01 +357,8.42E-01,4.57E-01,2.95E-01 +357.5,8.50E-01,4.62E-01,3.00E-01 +358,7.89E-01,4.30E-01,2.79E-01 +358.5,7.31E-01,3.99E-01,2.60E-01 +359,8.58E-01,4.70E-01,3.07E-01 +359.5,1.03E+00,5.65E-01,3.70E-01 +360,1.09E+00,5.98E-01,3.92E-01 +360.5,1.03E+00,5.65E-01,3.72E-01 +361,9.42E-01,5.20E-01,3.43E-01 +361.5,9.18E-01,5.10E-01,3.36E-01 +362,9.58E-01,5.34E-01,3.54E-01 +362.5,1.05E+00,5.85E-01,3.88E-01 +363,1.07E+00,6.02E-01,4.00E-01 +363.5,1.04E+00,5.85E-01,3.90E-01 +364,1.07E+00,6.06E-01,4.05E-01 +364.5,1.06E+00,6.01E-01,4.02E-01 +365,1.10E+00,6.24E-01,4.18E-01 +365.5,1.20E+00,6.86E-01,4.61E-01 +366,1.29E+00,7.35E-01,4.95E-01 +366.5,1.28E+00,7.37E-01,4.97E-01 +367,1.26E+00,7.23E-01,4.89E-01 +367.5,1.23E+00,7.09E-01,4.80E-01 +368,1.16E+00,6.68E-01,4.53E-01 +368.5,1.15E+00,6.63E-01,4.51E-01 +369,1.19E+00,6.93E-01,4.72E-01 +369.5,1.28E+00,7.45E-01,5.09E-01 +370,1.29E+00,7.55E-01,5.17E-01 +370.5,1.17E+00,6.83E-01,4.68E-01 +371,1.18E+00,6.93E-01,4.76E-01 +371.5,1.22E+00,7.21E-01,4.96E-01 +372,1.14E+00,6.74E-01,4.65E-01 +372.5,1.09E+00,6.43E-01,4.44E-01 +373,1.04E+00,6.19E-01,4.28E-01 +373.5,9.39E-01,5.58E-01,3.87E-01 +374,9.34E-01,5.56E-01,3.87E-01 +374.5,9.25E-01,5.52E-01,3.84E-01 +375,9.85E-01,5.89E-01,4.11E-01 +375.5,1.09E+00,6.52E-01,4.55E-01 +376,1.12E+00,6.75E-01,4.72E-01 +376.5,1.10E+00,6.64E-01,4.65E-01 +377,1.18E+00,7.12E-01,5.00E-01 +377.5,1.31E+00,7.95E-01,5.59E-01 +378,1.41E+00,8.56E-01,6.03E-01 +378.5,1.38E+00,8.34E-01,5.89E-01 +379,1.23E+00,7.44E-01,5.26E-01 +379.5,1.10E+00,6.67E-01,4.73E-01 +380,1.15E+00,7.01E-01,4.98E-01 +380.5,1.23E+00,7.51E-01,5.34E-01 +381,1.25E+00,7.64E-01,5.44E-01 +381.5,1.12E+00,6.88E-01,4.91E-01 +382,9.54E-01,5.87E-01,4.20E-01 +382.5,8.23E-01,5.08E-01,3.64E-01 +383,7.36E-01,4.55E-01,3.26E-01 +383.5,7.11E-01,4.40E-01,3.17E-01 +384,8.21E-01,5.10E-01,3.67E-01 +384.5,9.86E-01,6.14E-01,4.42E-01 +385,1.08E+00,6.74E-01,4.86E-01 +385.5,1.03E+00,6.44E-01,4.65E-01 +386,9.91E-01,6.21E-01,4.50E-01 +386.5,1.03E+00,6.46E-01,4.68E-01 +387,1.04E+00,6.51E-01,4.73E-01 +387.5,1.02E+00,6.42E-01,4.67E-01 +388,1.01E+00,6.36E-01,4.64E-01 +388.5,9.97E-01,6.31E-01,4.61E-01 +389,1.08E+00,6.85E-01,5.01E-01 +389.5,1.20E+00,7.60E-01,5.56E-01 +390,1.25E+00,7.97E-01,5.85E-01 +390.5,1.26E+00,8.04E-01,5.90E-01 +391,1.33E+00,8.51E-01,6.26E-01 +391.5,1.35E+00,8.63E-01,6.36E-01 +392,1.24E+00,7.95E-01,5.87E-01 +392.5,1.03E+00,6.63E-01,4.90E-01 +393,7.45E-01,4.80E-01,3.55E-01 +393.5,5.91E-01,3.82E-01,2.83E-01 +394,7.67E-01,4.96E-01,3.68E-01 +394.5,1.06E+00,6.84E-01,5.08E-01 +395,1.25E+00,8.08E-01,6.01E-01 +395.5,1.32E+00,8.60E-01,6.41E-01 +396,1.16E+00,7.57E-01,5.64E-01 +396.5,8.43E-01,5.50E-01,4.11E-01 +397,6.52E-01,4.26E-01,3.19E-01 +397.5,9.61E-01,6.29E-01,4.72E-01 +398,1.30E+00,8.52E-01,6.39E-01 +398.5,1.53E+00,1.01E+00,7.56E-01 +399,1.62E+00,1.07E+00,8.04E-01 +399.5,1.67E+00,1.10E+00,8.30E-01 +400,1.69E+00,1.11E+00,8.40E-01 +401,1.75E+00,1.16E+00,8.77E-01 +402,1.81E+00,1.21E+00,9.14E-01 +403,1.74E+00,1.16E+00,8.82E-01 +404,1.76E+00,1.18E+00,8.98E-01 +405,1.72E+00,1.15E+00,8.78E-01 +406,1.67E+00,1.12E+00,8.59E-01 +407,1.63E+00,1.10E+00,8.45E-01 +408,1.70E+00,1.15E+00,8.85E-01 +409,1.81E+00,1.23E+00,9.47E-01 +410,1.54E+00,1.05E+00,8.09E-01 +411,1.72E+00,1.17E+00,9.08E-01 +412,1.82E+00,1.25E+00,9.67E-01 +413,1.74E+00,1.20E+00,9.30E-01 +414,1.71E+00,1.18E+00,9.21E-01 +415,1.77E+00,1.23E+00,9.56E-01 +416,1.82E+00,1.26E+00,9.86E-01 +417,1.77E+00,1.23E+00,9.64E-01 +418,1.69E+00,1.18E+00,9.24E-01 +419,1.75E+00,1.23E+00,9.64E-01 +420,1.60E+00,1.12E+00,8.85E-01 +421,1.81E+00,1.28E+00,1.01E+00 +422,1.78E+00,1.26E+00,9.95E-01 +423,1.72E+00,1.22E+00,9.65E-01 +424,1.71E+00,1.21E+00,9.62E-01 +425,1.76E+00,1.25E+00,9.93E-01 +426,1.70E+00,1.21E+00,9.67E-01 +427,1.64E+00,1.17E+00,9.36E-01 +428,1.65E+00,1.18E+00,9.46E-01 +429,1.52E+00,1.10E+00,8.78E-01 +430,1.21E+00,8.75E-01,7.01E-01 +431,1.10E+00,7.94E-01,6.38E-01 +432,1.82E+00,1.32E+00,1.06E+00 +433,1.69E+00,1.23E+00,9.91E-01 +434,1.56E+00,1.14E+00,9.17E-01 +435,1.71E+00,1.25E+00,1.01E+00 +436,1.87E+00,1.37E+00,1.11E+00 +437,1.90E+00,1.39E+00,1.13E+00 +438,1.66E+00,1.22E+00,9.94E-01 +439,1.60E+00,1.18E+00,9.58E-01 +440,1.83E+00,1.35E+00,1.10E+00 +441,1.80E+00,1.33E+00,1.09E+00 +442,1.92E+00,1.43E+00,1.16E+00 +443,1.95E+00,1.45E+00,1.18E+00 +444,1.89E+00,1.41E+00,1.15E+00 +445,1.97E+00,1.46E+00,1.20E+00 +446,1.76E+00,1.31E+00,1.08E+00 +447,1.99E+00,1.49E+00,1.23E+00 +448,2.01E+00,1.51E+00,1.24E+00 +449,2.00E+00,1.50E+00,1.24E+00 +450,2.07E+00,1.56E+00,1.29E+00 +451,2.14E+00,1.62E+00,1.34E+00 +452,2.05E+00,1.55E+00,1.28E+00 +453,1.89E+00,1.43E+00,1.19E+00 +454,2.02E+00,1.53E+00,1.27E+00 +455,2.00E+00,1.52E+00,1.27E+00 +456,2.06E+00,1.57E+00,1.31E+00 +457,2.08E+00,1.59E+00,1.32E+00 +458,2.03E+00,1.55E+00,1.29E+00 +459,2.01E+00,1.54E+00,1.29E+00 +460,2.00E+00,1.53E+00,1.28E+00 +461,2.06E+00,1.58E+00,1.33E+00 +462,2.08E+00,1.60E+00,1.34E+00 +463,2.08E+00,1.60E+00,1.35E+00 +464,2.02E+00,1.55E+00,1.31E+00 +465,1.98E+00,1.54E+00,1.29E+00 +466,2.02E+00,1.57E+00,1.32E+00 +467,1.93E+00,1.50E+00,1.26E+00 +468,2.01E+00,1.56E+00,1.32E+00 +469,2.02E+00,1.57E+00,1.32E+00 +470,1.94E+00,1.51E+00,1.27E+00 +471,1.97E+00,1.53E+00,1.30E+00 +472,2.07E+00,1.61E+00,1.37E+00 +473,1.99E+00,1.55E+00,1.31E+00 +474,2.01E+00,1.57E+00,1.33E+00 +475,2.08E+00,1.62E+00,1.38E+00 +476,2.01E+00,1.56E+00,1.33E+00 +477,2.03E+00,1.57E+00,1.34E+00 +478,2.09E+00,1.62E+00,1.38E+00 +479,2.04E+00,1.59E+00,1.36E+00 +480,2.07E+00,1.62E+00,1.38E+00 +481,2.06E+00,1.62E+00,1.38E+00 +482,2.06E+00,1.62E+00,1.39E+00 +483,2.03E+00,1.60E+00,1.37E+00 +484,1.99E+00,1.57E+00,1.35E+00 +485,1.98E+00,1.57E+00,1.35E+00 +486,1.60E+00,1.27E+00,1.09E+00 +487,1.79E+00,1.42E+00,1.22E+00 +488,1.94E+00,1.54E+00,1.33E+00 +489,1.82E+00,1.45E+00,1.25E+00 +490,2.03E+00,1.62E+00,1.40E+00 +491,1.95E+00,1.56E+00,1.34E+00 +492,1.86E+00,1.49E+00,1.28E+00 +493,1.98E+00,1.59E+00,1.37E+00 +494,1.93E+00,1.55E+00,1.34E+00 +495,2.05E+00,1.65E+00,1.42E+00 +496,1.95E+00,1.57E+00,1.35E+00 +497,1.98E+00,1.59E+00,1.38E+00 +498,1.92E+00,1.55E+00,1.34E+00 +499,1.92E+00,1.55E+00,1.34E+00 +500,1.92E+00,1.55E+00,1.34E+00 +501,1.86E+00,1.50E+00,1.30E+00 +502,1.86E+00,1.50E+00,1.30E+00 +503,1.95E+00,1.57E+00,1.36E+00 +504,1.83E+00,1.46E+00,1.27E+00 +505,1.95E+00,1.56E+00,1.36E+00 +506,2.03E+00,1.63E+00,1.42E+00 +507,1.94E+00,1.56E+00,1.35E+00 +508,1.88E+00,1.52E+00,1.32E+00 +509,1.97E+00,1.59E+00,1.39E+00 +510,1.91E+00,1.55E+00,1.35E+00 +511,1.94E+00,1.58E+00,1.38E+00 +512,1.99E+00,1.62E+00,1.41E+00 +513,1.87E+00,1.52E+00,1.33E+00 +514,1.82E+00,1.49E+00,1.30E+00 +515,1.88E+00,1.53E+00,1.34E+00 +516,1.89E+00,1.55E+00,1.35E+00 +517,1.54E+00,1.26E+00,1.10E+00 +518,1.76E+00,1.44E+00,1.26E+00 +519,1.70E+00,1.40E+00,1.22E+00 +520,1.86E+00,1.52E+00,1.33E+00 +521,1.87E+00,1.53E+00,1.35E+00 +522,1.92E+00,1.57E+00,1.38E+00 +523,1.80E+00,1.48E+00,1.30E+00 +524,1.94E+00,1.59E+00,1.40E+00 +525,1.93E+00,1.58E+00,1.39E+00 +526,1.87E+00,1.53E+00,1.35E+00 +527,1.64E+00,1.34E+00,1.18E+00 +528,1.88E+00,1.54E+00,1.35E+00 +529,1.97E+00,1.61E+00,1.41E+00 +530,1.89E+00,1.54E+00,1.36E+00 +531,2.00E+00,1.63E+00,1.43E+00 +532,1.96E+00,1.60E+00,1.41E+00 +533,1.75E+00,1.43E+00,1.26E+00 +534,1.87E+00,1.53E+00,1.35E+00 +535,1.90E+00,1.55E+00,1.37E+00 +536,1.97E+00,1.62E+00,1.43E+00 +537,1.82E+00,1.50E+00,1.32E+00 +538,1.91E+00,1.57E+00,1.39E+00 +539,1.86E+00,1.54E+00,1.36E+00 +540,1.80E+00,1.48E+00,1.31E+00 +541,1.73E+00,1.43E+00,1.26E+00 +542,1.89E+00,1.55E+00,1.37E+00 +543,1.85E+00,1.53E+00,1.35E+00 +544,1.92E+00,1.58E+00,1.40E+00 +545,1.87E+00,1.54E+00,1.37E+00 +546,1.86E+00,1.53E+00,1.35E+00 +547,1.88E+00,1.55E+00,1.37E+00 +548,1.83E+00,1.50E+00,1.33E+00 +549,1.88E+00,1.55E+00,1.38E+00 +550,1.86E+00,1.54E+00,1.36E+00 +551,1.86E+00,1.54E+00,1.36E+00 +552,1.90E+00,1.57E+00,1.39E+00 +553,1.84E+00,1.53E+00,1.35E+00 +554,1.88E+00,1.55E+00,1.38E+00 +555,1.89E+00,1.56E+00,1.39E+00 +556,1.86E+00,1.54E+00,1.37E+00 +557,1.81E+00,1.50E+00,1.33E+00 +558,1.85E+00,1.53E+00,1.36E+00 +559,1.76E+00,1.45E+00,1.29E+00 +560,1.79E+00,1.47E+00,1.31E+00 +561,1.89E+00,1.56E+00,1.39E+00 +562,1.80E+00,1.48E+00,1.32E+00 +563,1.87E+00,1.54E+00,1.37E+00 +564,1.84E+00,1.51E+00,1.35E+00 +565,1.85E+00,1.52E+00,1.36E+00 +566,1.75E+00,1.44E+00,1.28E+00 +567,1.87E+00,1.53E+00,1.37E+00 +568,1.86E+00,1.52E+00,1.36E+00 +569,1.83E+00,1.48E+00,1.32E+00 +570,1.83E+00,1.48E+00,1.32E+00 +571,1.76E+00,1.43E+00,1.28E+00 +572,1.87E+00,1.51E+00,1.35E+00 +573,1.88E+00,1.52E+00,1.36E+00 +574,1.87E+00,1.51E+00,1.35E+00 +575,1.83E+00,1.48E+00,1.32E+00 +576,1.82E+00,1.47E+00,1.31E+00 +577,1.86E+00,1.50E+00,1.35E+00 +578,1.80E+00,1.46E+00,1.30E+00 +579,1.82E+00,1.48E+00,1.32E+00 +580,1.83E+00,1.50E+00,1.35E+00 +581,1.83E+00,1.51E+00,1.35E+00 +582,1.85E+00,1.53E+00,1.37E+00 +583,1.86E+00,1.55E+00,1.39E+00 +584,1.85E+00,1.54E+00,1.38E+00 +585,1.84E+00,1.53E+00,1.37E+00 +586,1.79E+00,1.50E+00,1.34E+00 +587,1.84E+00,1.53E+00,1.37E+00 +588,1.82E+00,1.49E+00,1.34E+00 +589,1.62E+00,1.29E+00,1.16E+00 +590,1.72E+00,1.37E+00,1.23E+00 +591,1.81E+00,1.47E+00,1.32E+00 +592,1.79E+00,1.44E+00,1.29E+00 +593,1.79E+00,1.46E+00,1.31E+00 +594,1.79E+00,1.45E+00,1.30E+00 +595,1.78E+00,1.43E+00,1.29E+00 +596,1.80E+00,1.47E+00,1.33E+00 +597,1.81E+00,1.48E+00,1.33E+00 +598,1.77E+00,1.46E+00,1.31E+00 +599,1.76E+00,1.46E+00,1.31E+00 +600,1.77E+00,1.48E+00,1.33E+00 +601,1.74E+00,1.46E+00,1.31E+00 +602,1.72E+00,1.44E+00,1.29E+00 +603,1.75E+00,1.47E+00,1.32E+00 +604,1.78E+00,1.49E+00,1.34E+00 +605,1.77E+00,1.49E+00,1.34E+00 +606,1.76E+00,1.48E+00,1.34E+00 +607,1.76E+00,1.49E+00,1.34E+00 +608,1.75E+00,1.49E+00,1.34E+00 +609,1.73E+00,1.47E+00,1.33E+00 +610,1.72E+00,1.47E+00,1.32E+00 +611,1.71E+00,1.46E+00,1.32E+00 +612,1.74E+00,1.48E+00,1.34E+00 +613,1.71E+00,1.46E+00,1.32E+00 +614,1.66E+00,1.42E+00,1.28E+00 +615,1.71E+00,1.47E+00,1.33E+00 +616,1.66E+00,1.43E+00,1.29E+00 +617,1.64E+00,1.41E+00,1.27E+00 +618,1.70E+00,1.47E+00,1.32E+00 +619,1.71E+00,1.47E+00,1.33E+00 +620,1.71E+00,1.47E+00,1.33E+00 +621,1.72E+00,1.48E+00,1.34E+00 +622,1.68E+00,1.43E+00,1.29E+00 +623,1.68E+00,1.42E+00,1.28E+00 +624,1.67E+00,1.41E+00,1.28E+00 +625,1.64E+00,1.40E+00,1.27E+00 +626,1.64E+00,1.40E+00,1.27E+00 +627,1.69E+00,1.44E+00,1.30E+00 +628,1.69E+00,1.36E+00,1.23E+00 +629,1.69E+00,1.41E+00,1.28E+00 +630,1.67E+00,1.39E+00,1.26E+00 +631,1.66E+00,1.42E+00,1.28E+00 +632,1.59E+00,1.36E+00,1.23E+00 +633,1.67E+00,1.45E+00,1.31E+00 +634,1.64E+00,1.43E+00,1.29E+00 +635,1.65E+00,1.45E+00,1.31E+00 +636,1.61E+00,1.41E+00,1.28E+00 +637,1.66E+00,1.46E+00,1.32E+00 +638,1.67E+00,1.47E+00,1.33E+00 +639,1.65E+00,1.46E+00,1.32E+00 +640,1.61E+00,1.43E+00,1.30E+00 +641,1.61E+00,1.43E+00,1.30E+00 +642,1.61E+00,1.44E+00,1.30E+00 +643,1.63E+00,1.45E+00,1.31E+00 +644,1.61E+00,1.45E+00,1.31E+00 +645,1.63E+00,1.46E+00,1.32E+00 +646,1.59E+00,1.42E+00,1.28E+00 +647,1.61E+00,1.41E+00,1.27E+00 +648,1.60E+00,1.40E+00,1.26E+00 +649,1.55E+00,1.35E+00,1.22E+00 +650,1.53E+00,1.36E+00,1.23E+00 +651,1.61E+00,1.44E+00,1.31E+00 +652,1.59E+00,1.39E+00,1.26E+00 +653,1.60E+00,1.43E+00,1.30E+00 +654,1.58E+00,1.42E+00,1.28E+00 +655,1.52E+00,1.35E+00,1.22E+00 +656,1.32E+00,1.19E+00,1.07E+00 +657,1.38E+00,1.24E+00,1.12E+00 +658,1.54E+00,1.39E+00,1.25E+00 +659,1.54E+00,1.39E+00,1.26E+00 +660,1.56E+00,1.40E+00,1.27E+00 +661,1.57E+00,1.39E+00,1.26E+00 +662,1.57E+00,1.38E+00,1.25E+00 +663,1.56E+00,1.38E+00,1.25E+00 +664,1.55E+00,1.40E+00,1.26E+00 +665,1.57E+00,1.42E+00,1.29E+00 +666,1.56E+00,1.42E+00,1.29E+00 +667,1.54E+00,1.41E+00,1.28E+00 +668,1.53E+00,1.42E+00,1.28E+00 +669,1.56E+00,1.44E+00,1.30E+00 +670,1.53E+00,1.42E+00,1.29E+00 +671,1.53E+00,1.42E+00,1.28E+00 +672,1.51E+00,1.40E+00,1.27E+00 +673,1.52E+00,1.41E+00,1.28E+00 +674,1.51E+00,1.41E+00,1.27E+00 +675,1.50E+00,1.40E+00,1.26E+00 +676,1.52E+00,1.41E+00,1.28E+00 +677,1.50E+00,1.40E+00,1.27E+00 +678,1.51E+00,1.41E+00,1.27E+00 +679,1.49E+00,1.39E+00,1.26E+00 +680,1.49E+00,1.40E+00,1.27E+00 +681,1.49E+00,1.39E+00,1.26E+00 +682,1.49E+00,1.40E+00,1.27E+00 +683,1.48E+00,1.38E+00,1.25E+00 +684,1.47E+00,1.37E+00,1.24E+00 +685,1.47E+00,1.37E+00,1.25E+00 +686,1.43E+00,1.34E+00,1.22E+00 +687,1.47E+00,9.68E-01,8.83E-01 +688,1.48E+00,1.12E+00,1.02E+00 +689,1.48E+00,1.13E+00,1.03E+00 +690,1.48E+00,1.18E+00,1.07E+00 +691,1.47E+00,1.23E+00,1.12E+00 +692,1.45E+00,1.27E+00,1.15E+00 +693,1.46E+00,1.26E+00,1.14E+00 +694,1.46E+00,1.25E+00,1.13E+00 +695,1.44E+00,1.27E+00,1.15E+00 +696,1.44E+00,1.27E+00,1.15E+00 +697,1.44E+00,1.34E+00,1.22E+00 +698,1.42E+00,1.32E+00,1.20E+00 +699,1.43E+00,1.29E+00,1.17E+00 +700,1.42E+00,1.28E+00,1.16E+00 +701,1.41E+00,1.27E+00,1.15E+00 +702,1.40E+00,1.27E+00,1.15E+00 +703,1.41E+00,1.27E+00,1.16E+00 +704,1.42E+00,1.31E+00,1.19E+00 +705,1.43E+00,1.32E+00,1.20E+00 +706,1.41E+00,1.31E+00,1.19E+00 +707,1.40E+00,1.31E+00,1.19E+00 +708,1.40E+00,1.30E+00,1.18E+00 +709,1.39E+00,1.31E+00,1.19E+00 +710,1.40E+00,1.32E+00,1.20E+00 +711,1.40E+00,1.32E+00,1.19E+00 +712,1.38E+00,1.31E+00,1.19E+00 +713,1.37E+00,1.29E+00,1.17E+00 +714,1.38E+00,1.30E+00,1.18E+00 +715,1.35E+00,1.26E+00,1.14E+00 +716,1.37E+00,1.27E+00,1.15E+00 +717,1.37E+00,1.11E+00,1.01E+00 +718,1.36E+00,1.03E+00,9.39E-01 +719,1.30E+00,9.23E-01,8.43E-01 +720,1.35E+00,9.86E-01,8.99E-01 +721,1.35E+00,1.09E+00,9.90E-01 +722,1.36E+00,1.24E+00,1.13E+00 +723,1.35E+00,1.14E+00,1.04E+00 +724,1.36E+00,1.06E+00,9.63E-01 +725,1.35E+00,1.04E+00,9.47E-01 +726,1.34E+00,1.08E+00,9.86E-01 +727,1.34E+00,1.09E+00,9.90E-01 +728,1.34E+00,1.04E+00,9.50E-01 +729,1.28E+00,1.05E+00,9.55E-01 +730,1.34E+00,1.13E+00,1.03E+00 +731,1.31E+00,1.07E+00,9.77E-01 +732,1.33E+00,1.15E+00,1.05E+00 +733,1.31E+00,1.20E+00,1.09E+00 +734,1.34E+00,1.24E+00,1.13E+00 +735,1.33E+00,1.22E+00,1.11E+00 +736,1.31E+00,1.21E+00,1.10E+00 +737,1.31E+00,1.20E+00,1.10E+00 +738,1.30E+00,1.23E+00,1.12E+00 +739,1.26E+00,1.19E+00,1.09E+00 +740,1.28E+00,1.22E+00,1.11E+00 +741,1.27E+00,1.21E+00,1.11E+00 +742,1.26E+00,1.22E+00,1.11E+00 +743,1.29E+00,1.24E+00,1.13E+00 +744,1.30E+00,1.25E+00,1.14E+00 +745,1.29E+00,1.25E+00,1.14E+00 +746,1.29E+00,1.25E+00,1.14E+00 +747,1.29E+00,1.25E+00,1.14E+00 +748,1.28E+00,1.24E+00,1.13E+00 +749,1.28E+00,1.24E+00,1.13E+00 +750,1.27E+00,1.23E+00,1.13E+00 +751,1.27E+00,1.23E+00,1.12E+00 +752,1.27E+00,1.23E+00,1.13E+00 +753,1.27E+00,1.23E+00,1.12E+00 +754,1.28E+00,1.24E+00,1.14E+00 +755,1.28E+00,1.24E+00,1.13E+00 +756,1.26E+00,1.22E+00,1.12E+00 +757,1.26E+00,1.22E+00,1.12E+00 +758,1.27E+00,1.23E+00,1.12E+00 +759,1.25E+00,1.19E+00,1.09E+00 +760,1.26E+00,2.66E-01,2.47E-01 +761,1.25E+00,1.54E-01,1.43E-01 +762,1.25E+00,6.88E-01,6.35E-01 +763,1.25E+00,3.80E-01,3.52E-01 +764,1.26E+00,5.39E-01,4.99E-01 +765,1.25E+00,6.86E-01,6.34E-01 +766,1.20E+00,8.15E-01,7.51E-01 +767,1.21E+00,9.74E-01,8.96E-01 +768,1.23E+00,1.11E+00,1.02E+00 +769,1.21E+00,1.13E+00,1.03E+00 +770,1.21E+00,1.16E+00,1.06E+00 +771,1.21E+00,1.17E+00,1.07E+00 +772,1.21E+00,1.18E+00,1.08E+00 +773,1.21E+00,1.18E+00,1.08E+00 +774,1.21E+00,1.18E+00,1.08E+00 +775,1.21E+00,1.18E+00,1.08E+00 +776,1.21E+00,1.18E+00,1.08E+00 +777,1.20E+00,1.17E+00,1.08E+00 +778,1.20E+00,1.17E+00,1.08E+00 +779,1.21E+00,1.18E+00,1.08E+00 +780,1.19E+00,1.16E+00,1.07E+00 +781,1.19E+00,1.16E+00,1.07E+00 +782,1.20E+00,1.17E+00,1.07E+00 +783,1.19E+00,1.16E+00,1.07E+00 +784,1.18E+00,1.15E+00,1.06E+00 +785,1.19E+00,1.16E+00,1.06E+00 +786,1.19E+00,1.16E+00,1.07E+00 +787,1.19E+00,1.15E+00,1.05E+00 +788,1.18E+00,1.13E+00,1.04E+00 +789,1.18E+00,1.13E+00,1.04E+00 +790,1.17E+00,1.09E+00,1.00E+00 +791,1.16E+00,1.11E+00,1.02E+00 +792,1.15E+00,1.10E+00,1.01E+00 +793,1.14E+00,1.09E+00,1.00E+00 +794,1.13E+00,1.10E+00,1.01E+00 +795,1.13E+00,1.09E+00,1.01E+00 +796,1.14E+00,1.07E+00,9.90E-01 +797,1.16E+00,1.09E+00,1.01E+00 +798,1.15E+00,1.11E+00,1.02E+00 +799,1.14E+00,1.09E+00,1.00E+00 +800,1.12E+00,1.07E+00,9.89E-01 +801,1.14E+00,1.08E+00,1.00E+00 +802,1.14E+00,1.09E+00,1.00E+00 +803,1.12E+00,1.07E+00,9.83E-01 +804,1.13E+00,1.08E+00,9.95E-01 +805,1.10E+00,1.05E+00,9.73E-01 +806,1.13E+00,1.10E+00,1.01E+00 +807,1.12E+00,1.09E+00,1.00E+00 +808,1.12E+00,1.08E+00,9.98E-01 +809,1.10E+00,1.05E+00,9.74E-01 +810,1.11E+00,1.06E+00,9.75E-01 +811,1.11E+00,1.05E+00,9.73E-01 +812,1.12E+00,1.03E+00,9.49E-01 +813,1.12E+00,1.01E+00,9.32E-01 +814,1.12E+00,9.04E-01,8.37E-01 +815,1.11E+00,8.95E-01,8.29E-01 +816,1.11E+00,8.32E-01,7.72E-01 +817,1.11E+00,8.52E-01,7.90E-01 +818,1.09E+00,8.23E-01,7.63E-01 +819,1.07E+00,9.05E-01,8.38E-01 +820,1.07E+00,8.62E-01,7.99E-01 +821,1.08E+00,9.98E-01,9.23E-01 +822,1.06E+00,9.52E-01,8.81E-01 +823,1.08E+00,6.73E-01,6.26E-01 +824,1.07E+00,9.35E-01,8.66E-01 +825,1.07E+00,9.69E-01,8.98E-01 +826,1.08E+00,9.34E-01,8.65E-01 +827,1.08E+00,9.85E-01,9.12E-01 +828,1.07E+00,8.50E-01,7.89E-01 +829,1.06E+00,9.29E-01,8.61E-01 +830,1.06E+00,9.16E-01,8.49E-01 +831,1.06E+00,9.24E-01,8.57E-01 +832,1.06E+00,8.94E-01,8.30E-01 +833,1.03E+00,9.57E-01,8.86E-01 +834,1.05E+00,9.34E-01,8.66E-01 +835,1.05E+00,1.00E+00,9.29E-01 +836,1.06E+00,9.72E-01,9.01E-01 +837,1.05E+00,1.01E+00,9.35E-01 +838,1.05E+00,9.99E-01,9.26E-01 +839,1.04E+00,1.00E+00,9.28E-01 +840,1.05E+00,1.02E+00,9.41E-01 +841,1.05E+00,1.01E+00,9.36E-01 +842,1.03E+00,9.97E-01,9.24E-01 +843,1.03E+00,1.01E+00,9.32E-01 +844,1.01E+00,9.86E-01,9.14E-01 +845,1.04E+00,1.02E+00,9.42E-01 +846,1.04E+00,1.02E+00,9.44E-01 +847,1.01E+00,9.92E-01,9.19E-01 +848,1.01E+00,9.92E-01,9.20E-01 +849,1.01E+00,9.86E-01,9.14E-01 +850,9.10E-01,8.94E-01,8.29E-01 +851,9.98E-01,9.75E-01,9.05E-01 +852,9.90E-01,9.69E-01,8.99E-01 +853,9.81E-01,9.65E-01,8.95E-01 +854,8.69E-01,8.51E-01,7.90E-01 +855,9.27E-01,9.13E-01,8.47E-01 +856,9.90E-01,9.73E-01,9.03E-01 +857,1.01E+00,9.92E-01,9.21E-01 +858,1.01E+00,9.92E-01,9.21E-01 +859,1.01E+00,9.92E-01,9.21E-01 +860,1.00E+00,9.88E-01,9.18E-01 +861,9.99E-01,9.87E-01,9.16E-01 +862,1.01E+00,9.94E-01,9.24E-01 +863,1.01E+00,1.00E+00,9.29E-01 +864,9.90E-01,9.79E-01,9.10E-01 +865,9.74E-01,9.63E-01,8.95E-01 +866,8.58E-01,8.49E-01,7.89E-01 +867,9.25E-01,9.15E-01,8.51E-01 +868,9.69E-01,9.59E-01,8.91E-01 +869,9.59E-01,9.50E-01,8.83E-01 +870,9.77E-01,9.68E-01,8.99E-01 +871,9.63E-01,9.54E-01,8.87E-01 +872,9.76E-01,9.67E-01,8.99E-01 +873,9.66E-01,9.57E-01,8.90E-01 +874,9.49E-01,9.40E-01,8.75E-01 +875,9.36E-01,9.27E-01,8.62E-01 +876,9.62E-01,9.53E-01,8.86E-01 +877,9.65E-01,9.56E-01,8.89E-01 +878,9.62E-01,9.52E-01,8.86E-01 +879,9.46E-01,9.37E-01,8.71E-01 +880,9.49E-01,9.40E-01,8.74E-01 +881,9.20E-01,9.09E-01,8.46E-01 +882,9.44E-01,9.32E-01,8.68E-01 +883,9.39E-01,9.29E-01,8.65E-01 +884,9.44E-01,9.33E-01,8.69E-01 +885,9.55E-01,9.44E-01,8.79E-01 +886,9.26E-01,9.08E-01,8.45E-01 +887,9.23E-01,9.11E-01,8.48E-01 +888,9.41E-01,9.22E-01,8.59E-01 +889,9.44E-01,9.35E-01,8.70E-01 +890,9.42E-01,9.24E-01,8.61E-01 +891,9.39E-01,9.26E-01,8.63E-01 +892,9.33E-01,9.09E-01,8.47E-01 +893,9.18E-01,8.73E-01,8.14E-01 +894,9.24E-01,8.51E-01,7.94E-01 +895,9.26E-01,8.14E-01,7.60E-01 +896,9.34E-01,7.63E-01,7.13E-01 +897,9.27E-01,6.66E-01,6.23E-01 +898,9.24E-01,7.18E-01,6.71E-01 +899,9.14E-01,5.49E-01,5.15E-01 +900,9.14E-01,7.43E-01,6.94E-01 +901,8.98E-01,5.99E-01,5.62E-01 +902,8.77E-01,6.68E-01,6.25E-01 +903,9.22E-01,6.89E-01,6.45E-01 +904,9.21E-01,8.45E-01,7.89E-01 +905,9.18E-01,8.17E-01,7.63E-01 +906,9.08E-01,7.76E-01,7.25E-01 +907,9.15E-01,6.39E-01,5.98E-01 +908,9.01E-01,6.52E-01,6.11E-01 +909,8.86E-01,7.04E-01,6.59E-01 +910,8.95E-01,6.25E-01,5.86E-01 +911,8.97E-01,6.68E-01,6.26E-01 +912,8.90E-01,6.89E-01,6.45E-01 +913,9.00E-01,6.28E-01,5.89E-01 +914,8.98E-01,6.26E-01,5.87E-01 +915,8.88E-01,6.78E-01,6.36E-01 +916,8.95E-01,5.76E-01,5.41E-01 +917,8.89E-01,7.30E-01,6.84E-01 +918,8.88E-01,5.93E-01,5.56E-01 +919,8.92E-01,7.39E-01,6.92E-01 +920,8.85E-01,7.44E-01,6.97E-01 +921,8.70E-01,7.80E-01,7.30E-01 +922,8.63E-01,7.00E-01,6.56E-01 +923,8.33E-01,7.45E-01,6.97E-01 +924,8.70E-01,7.22E-01,6.76E-01 +925,8.76E-01,7.11E-01,6.66E-01 +926,8.46E-01,7.03E-01,6.59E-01 +927,8.78E-01,7.87E-01,7.37E-01 +928,8.71E-01,5.90E-01,5.54E-01 +929,8.70E-01,5.51E-01,5.18E-01 +930,8.69E-01,4.32E-01,4.07E-01 +931,8.71E-01,4.09E-01,3.85E-01 +932,8.65E-01,3.01E-01,2.84E-01 +933,8.70E-01,2.48E-01,2.35E-01 +934,8.67E-01,1.44E-01,1.36E-01 +935,8.56E-01,2.51E-01,2.37E-01 +936,8.52E-01,1.61E-01,1.53E-01 +937,8.54E-01,1.63E-01,1.55E-01 +938,8.59E-01,2.01E-01,1.90E-01 +939,8.57E-01,3.99E-01,3.76E-01 +940,8.40E-01,4.72E-01,4.44E-01 +941,8.32E-01,3.72E-01,3.51E-01 +942,8.06E-01,4.05E-01,3.82E-01 +943,8.38E-01,2.78E-01,2.63E-01 +944,8.19E-01,2.86E-01,2.70E-01 +945,8.24E-01,3.68E-01,3.47E-01 +946,8.31E-01,1.95E-01,1.84E-01 +947,8.28E-01,3.71E-01,3.50E-01 +948,8.31E-01,2.74E-01,2.59E-01 +949,8.33E-01,4.94E-01,4.65E-01 +950,8.29E-01,1.47E-01,1.39E-01 +951,8.20E-01,4.84E-01,4.56E-01 +952,8.24E-01,2.69E-01,2.54E-01 +953,8.21E-01,3.44E-01,3.24E-01 +954,8.12E-01,4.24E-01,4.00E-01 +955,7.69E-01,3.41E-01,3.22E-01 +956,8.02E-01,3.28E-01,3.10E-01 +957,8.06E-01,2.71E-01,2.56E-01 +958,8.11E-01,4.61E-01,4.35E-01 +959,8.15E-01,3.74E-01,3.53E-01 +960,8.06E-01,4.21E-01,3.97E-01 +961,8.00E-01,4.61E-01,4.35E-01 +962,8.02E-01,4.42E-01,4.17E-01 +963,7.98E-01,5.05E-01,4.76E-01 +964,7.88E-01,4.59E-01,4.32E-01 +965,7.96E-01,5.04E-01,4.75E-01 +966,7.86E-01,5.03E-01,4.74E-01 +967,7.95E-01,5.02E-01,4.74E-01 +968,7.85E-01,6.52E-01,6.13E-01 +969,7.88E-01,6.86E-01,6.45E-01 +970,7.91E-01,6.35E-01,5.97E-01 +971,7.82E-01,7.14E-01,6.71E-01 +972,7.88E-01,6.88E-01,6.46E-01 +973,7.81E-01,6.06E-01,5.71E-01 +974,7.69E-01,5.75E-01,5.42E-01 +975,7.73E-01,5.90E-01,5.55E-01 +976,7.81E-01,5.72E-01,5.39E-01 +977,7.72E-01,6.39E-01,6.01E-01 +978,7.78E-01,6.15E-01,5.79E-01 +979,7.67E-01,6.38E-01,6.00E-01 +980,7.75E-01,6.05E-01,5.69E-01 +981,7.73E-01,7.13E-01,6.71E-01 +982,7.79E-01,6.92E-01,6.51E-01 +983,7.75E-01,6.69E-01,6.29E-01 +984,7.69E-01,7.37E-01,6.93E-01 +985,7.71E-01,6.88E-01,6.47E-01 +986,7.66E-01,7.51E-01,7.06E-01 +987,7.66E-01,7.39E-01,6.95E-01 +988,7.64E-01,7.35E-01,6.91E-01 +989,7.55E-01,7.49E-01,7.04E-01 +990,7.57E-01,7.32E-01,6.88E-01 +991,7.62E-01,7.54E-01,7.08E-01 +992,7.57E-01,7.51E-01,7.06E-01 +993,7.56E-01,7.37E-01,6.93E-01 +994,7.59E-01,7.54E-01,7.09E-01 +995,7.54E-01,7.52E-01,7.07E-01 +996,7.53E-01,7.49E-01,7.04E-01 +997,7.43E-01,7.40E-01,6.96E-01 +998,7.43E-01,7.39E-01,6.95E-01 +999,7.42E-01,7.39E-01,6.95E-01 +1000,7.43E-01,7.35E-01,6.92E-01 +1001,7.47E-01,7.44E-01,7.00E-01 +1002,7.47E-01,7.28E-01,6.85E-01 +1003,7.38E-01,7.34E-01,6.91E-01 +1004,7.31E-01,7.23E-01,6.81E-01 +1005,6.84E-01,6.82E-01,6.41E-01 +1006,7.18E-01,7.13E-01,6.70E-01 +1007,7.31E-01,7.28E-01,6.85E-01 +1008,7.33E-01,7.27E-01,6.84E-01 +1009,7.29E-01,7.20E-01,6.77E-01 +1010,7.31E-01,7.19E-01,6.77E-01 +1011,7.26E-01,7.23E-01,6.80E-01 +1012,7.25E-01,7.19E-01,6.77E-01 +1013,7.20E-01,7.18E-01,6.76E-01 +1014,7.23E-01,7.21E-01,6.78E-01 +1015,7.11E-01,7.08E-01,6.67E-01 +1016,7.14E-01,7.11E-01,6.70E-01 +1017,7.07E-01,7.03E-01,6.62E-01 +1018,7.16E-01,7.14E-01,6.73E-01 +1019,6.96E-01,6.89E-01,6.49E-01 +1020,7.01E-01,6.99E-01,6.58E-01 +1021,7.03E-01,7.02E-01,6.61E-01 +1022,6.93E-01,6.90E-01,6.50E-01 +1023,6.99E-01,6.95E-01,6.55E-01 +1024,7.01E-01,6.91E-01,6.51E-01 +1025,6.99E-01,6.98E-01,6.57E-01 +1026,6.99E-01,6.96E-01,6.56E-01 +1027,6.96E-01,6.93E-01,6.53E-01 +1028,6.97E-01,6.94E-01,6.54E-01 +1029,6.90E-01,6.86E-01,6.47E-01 +1030,6.92E-01,6.91E-01,6.51E-01 +1031,6.90E-01,6.87E-01,6.48E-01 +1032,6.90E-01,6.88E-01,6.49E-01 +1033,6.78E-01,6.76E-01,6.38E-01 +1034,6.82E-01,6.80E-01,6.41E-01 +1035,6.84E-01,6.82E-01,6.43E-01 +1036,6.84E-01,6.82E-01,6.43E-01 +1037,6.77E-01,6.75E-01,6.37E-01 +1038,6.74E-01,6.72E-01,6.34E-01 +1039,6.79E-01,6.76E-01,6.38E-01 +1040,6.74E-01,6.72E-01,6.34E-01 +1041,6.75E-01,6.72E-01,6.34E-01 +1042,6.75E-01,6.72E-01,6.34E-01 +1043,6.69E-01,6.65E-01,6.28E-01 +1044,6.72E-01,6.68E-01,6.31E-01 +1045,6.68E-01,6.65E-01,6.27E-01 +1046,6.51E-01,6.47E-01,6.11E-01 +1047,6.62E-01,6.57E-01,6.20E-01 +1048,6.68E-01,6.63E-01,6.26E-01 +1049,6.65E-01,6.59E-01,6.22E-01 +1050,6.61E-01,6.55E-01,6.18E-01 +1051,6.62E-01,6.55E-01,6.19E-01 +1052,6.58E-01,6.51E-01,6.15E-01 +1053,6.57E-01,6.49E-01,6.13E-01 +1054,6.55E-01,6.46E-01,6.10E-01 +1055,6.58E-01,6.48E-01,6.12E-01 +1056,6.56E-01,6.46E-01,6.11E-01 +1057,6.55E-01,6.45E-01,6.09E-01 +1058,6.49E-01,6.38E-01,6.03E-01 +1059,6.30E-01,6.19E-01,5.85E-01 +1060,6.48E-01,6.36E-01,6.01E-01 +1061,6.34E-01,6.21E-01,5.87E-01 +1062,6.47E-01,6.33E-01,5.98E-01 +1063,6.37E-01,6.22E-01,5.88E-01 +1064,6.46E-01,6.32E-01,5.97E-01 +1065,6.45E-01,6.29E-01,5.95E-01 +1066,6.31E-01,6.17E-01,5.83E-01 +1067,6.35E-01,6.20E-01,5.86E-01 +1068,6.36E-01,6.19E-01,5.86E-01 +1069,6.01E-01,5.86E-01,5.54E-01 +1070,6.22E-01,6.05E-01,5.72E-01 +1071,6.28E-01,6.17E-01,5.83E-01 +1072,6.31E-01,6.15E-01,5.82E-01 +1073,6.18E-01,6.04E-01,5.71E-01 +1074,6.31E-01,6.22E-01,5.88E-01 +1075,6.18E-01,5.93E-01,5.61E-01 +1076,6.25E-01,6.15E-01,5.81E-01 +1077,6.24E-01,6.04E-01,5.72E-01 +1078,6.25E-01,6.03E-01,5.71E-01 +1079,6.12E-01,6.05E-01,5.72E-01 +1080,6.23E-01,5.97E-01,5.65E-01 +1081,6.07E-01,5.81E-01,5.50E-01 +1082,6.02E-01,5.89E-01,5.58E-01 +1083,6.09E-01,5.98E-01,5.66E-01 +1084,6.14E-01,5.79E-01,5.48E-01 +1085,6.12E-01,5.93E-01,5.62E-01 +1086,6.16E-01,5.54E-01,5.25E-01 +1087,5.91E-01,5.67E-01,5.37E-01 +1088,6.07E-01,5.93E-01,5.62E-01 +1089,6.09E-01,5.79E-01,5.49E-01 +1090,6.04E-01,5.56E-01,5.27E-01 +1091,6.08E-01,5.88E-01,5.57E-01 +1092,5.97E-01,5.81E-01,5.50E-01 +1093,5.92E-01,5.11E-01,4.84E-01 +1094,5.61E-01,5.40E-01,5.11E-01 +1095,5.83E-01,5.21E-01,4.94E-01 +1096,5.86E-01,5.03E-01,4.77E-01 +1097,5.91E-01,5.79E-01,5.48E-01 +1098,5.87E-01,5.03E-01,4.77E-01 +1099,5.82E-01,5.08E-01,4.82E-01 +1100,6.00E-01,4.86E-01,4.61E-01 +1101,5.99E-01,4.97E-01,4.72E-01 +1102,5.82E-01,4.69E-01,4.45E-01 +1103,5.95E-01,4.66E-01,4.43E-01 +1104,5.93E-01,4.68E-01,4.44E-01 +1105,5.91E-01,5.06E-01,4.81E-01 +1106,5.90E-01,3.98E-01,3.78E-01 +1107,5.86E-01,4.83E-01,4.59E-01 +1108,5.87E-01,4.16E-01,3.95E-01 +1109,5.86E-01,4.13E-01,3.92E-01 +1110,5.87E-01,4.79E-01,4.55E-01 +1111,5.83E-01,3.32E-01,3.16E-01 +1112,5.83E-01,4.14E-01,3.93E-01 +1113,5.78E-01,2.69E-01,2.56E-01 +1114,5.84E-01,3.00E-01,2.86E-01 +1115,5.82E-01,2.50E-01,2.38E-01 +1116,5.75E-01,2.01E-01,1.92E-01 +1117,5.83E-01,7.96E-02,7.62E-02 +1118,5.72E-01,2.18E-01,2.08E-01 +1119,5.72E-01,1.13E-01,1.08E-01 +1120,5.69E-01,1.42E-01,1.36E-01 +1121,5.72E-01,1.86E-01,1.78E-01 +1122,5.75E-01,8.17E-02,7.82E-02 +1123,5.74E-01,1.28E-01,1.23E-01 +1124,5.73E-01,1.09E-01,1.04E-01 +1125,5.70E-01,1.44E-01,1.38E-01 +1126,5.53E-01,5.16E-02,4.94E-02 +1127,5.62E-01,1.57E-01,1.50E-01 +1128,5.68E-01,9.92E-02,9.49E-02 +1129,5.68E-01,1.06E-01,1.01E-01 +1130,5.64E-01,7.06E-02,6.76E-02 +1131,5.68E-01,2.96E-01,2.82E-01 +1132,5.70E-01,2.34E-01,2.24E-01 +1133,5.62E-01,1.53E-01,1.47E-01 +1134,5.63E-01,4.17E-02,4.00E-02 +1135,5.63E-01,1.55E-02,1.48E-02 +1136,5.65E-01,1.29E-01,1.23E-01 +1137,5.52E-01,2.88E-01,2.75E-01 +1138,5.44E-01,2.03E-01,1.94E-01 +1139,5.53E-01,2.99E-01,2.85E-01 +1140,5.56E-01,2.56E-01,2.44E-01 +1141,5.43E-01,1.93E-01,1.85E-01 +1142,5.55E-01,2.25E-01,2.15E-01 +1143,5.50E-01,3.12E-01,2.98E-01 +1144,5.45E-01,1.13E-01,1.08E-01 +1145,5.50E-01,1.46E-01,1.40E-01 +1146,5.54E-01,1.58E-01,1.51E-01 +1147,5.54E-01,5.92E-02,5.67E-02 +1148,5.50E-01,2.71E-01,2.59E-01 +1149,5.48E-01,2.19E-01,2.09E-01 +1150,5.46E-01,1.22E-01,1.16E-01 +1151,5.45E-01,2.03E-01,1.95E-01 +1152,5.42E-01,2.48E-01,2.37E-01 +1153,5.43E-01,2.38E-01,2.28E-01 +1154,5.47E-01,1.42E-01,1.36E-01 +1155,5.47E-01,3.13E-01,2.99E-01 +1156,5.40E-01,2.81E-01,2.68E-01 +1157,5.44E-01,3.15E-01,3.00E-01 +1158,5.43E-01,3.12E-01,2.98E-01 +1159,5.35E-01,3.37E-01,3.22E-01 +1160,5.29E-01,2.86E-01,2.74E-01 +1161,5.19E-01,3.48E-01,3.32E-01 +1162,5.33E-01,3.50E-01,3.34E-01 +1163,5.37E-01,4.69E-01,4.46E-01 +1164,5.27E-01,4.02E-01,3.83E-01 +1165,5.35E-01,3.89E-01,3.71E-01 +1166,5.22E-01,3.75E-01,3.58E-01 +1167,5.30E-01,4.10E-01,3.91E-01 +1168,5.34E-01,4.20E-01,4.00E-01 +1169,5.16E-01,4.23E-01,4.03E-01 +1170,5.29E-01,4.59E-01,4.37E-01 +1171,5.31E-01,4.48E-01,4.28E-01 +1172,5.31E-01,4.55E-01,4.34E-01 +1173,5.27E-01,4.56E-01,4.35E-01 +1174,5.28E-01,3.37E-01,3.22E-01 +1175,5.19E-01,4.52E-01,4.31E-01 +1176,5.10E-01,4.77E-01,4.54E-01 +1177,5.23E-01,4.72E-01,4.50E-01 +1178,5.17E-01,3.60E-01,3.44E-01 +1179,5.15E-01,4.84E-01,4.61E-01 +1180,5.22E-01,4.41E-01,4.21E-01 +1181,5.18E-01,4.55E-01,4.34E-01 +1182,5.17E-01,3.23E-01,3.09E-01 +1183,4.88E-01,4.39E-01,4.19E-01 +1184,5.11E-01,4.20E-01,4.01E-01 +1185,5.16E-01,4.07E-01,3.89E-01 +1186,5.15E-01,4.77E-01,4.55E-01 +1187,5.15E-01,4.56E-01,4.35E-01 +1188,5.10E-01,3.35E-01,3.20E-01 +1189,4.84E-01,4.16E-01,3.97E-01 +1190,5.06E-01,4.62E-01,4.41E-01 +1191,5.14E-01,4.47E-01,4.26E-01 +1192,5.12E-01,4.73E-01,4.52E-01 +1193,5.11E-01,4.54E-01,4.34E-01 +1194,5.11E-01,4.69E-01,4.48E-01 +1195,5.06E-01,4.47E-01,4.27E-01 +1196,5.06E-01,4.31E-01,4.12E-01 +1197,5.03E-01,4.77E-01,4.55E-01 +1198,4.92E-01,4.34E-01,4.14E-01 +1199,4.74E-01,3.65E-01,3.49E-01 +1200,5.00E-01,4.48E-01,4.28E-01 +1201,5.06E-01,4.37E-01,4.17E-01 +1202,5.07E-01,4.37E-01,4.17E-01 +1203,4.88E-01,4.34E-01,4.14E-01 +1204,4.87E-01,3.62E-01,3.46E-01 +1205,5.02E-01,4.37E-01,4.17E-01 +1206,4.99E-01,4.81E-01,4.59E-01 +1207,5.01E-01,4.30E-01,4.10E-01 +1208,4.90E-01,4.33E-01,4.14E-01 +1209,4.66E-01,4.14E-01,3.95E-01 +1210,4.92E-01,4.53E-01,4.33E-01 +1211,4.79E-01,4.22E-01,4.03E-01 +1212,4.91E-01,4.25E-01,4.06E-01 +1213,4.92E-01,4.70E-01,4.48E-01 +1214,4.89E-01,4.34E-01,4.14E-01 +1215,4.90E-01,4.28E-01,4.09E-01 +1216,4.89E-01,4.66E-01,4.45E-01 +1217,4.88E-01,4.55E-01,4.35E-01 +1218,4.86E-01,4.59E-01,4.38E-01 +1219,4.82E-01,4.47E-01,4.26E-01 +1220,4.84E-01,4.58E-01,4.37E-01 +1221,4.83E-01,4.65E-01,4.44E-01 +1222,4.81E-01,4.51E-01,4.31E-01 +1223,4.76E-01,4.44E-01,4.24E-01 +1224,4.82E-01,4.48E-01,4.28E-01 +1225,4.79E-01,4.62E-01,4.41E-01 +1226,4.80E-01,4.68E-01,4.47E-01 +1227,4.68E-01,4.33E-01,4.14E-01 +1228,4.74E-01,4.67E-01,4.45E-01 +1229,4.77E-01,4.67E-01,4.46E-01 +1230,4.75E-01,4.60E-01,4.39E-01 +1231,4.74E-01,4.72E-01,4.51E-01 +1232,4.69E-01,4.66E-01,4.45E-01 +1233,4.71E-01,4.54E-01,4.34E-01 +1234,4.69E-01,4.70E-01,4.49E-01 +1235,4.66E-01,4.65E-01,4.44E-01 +1236,4.69E-01,4.69E-01,4.48E-01 +1237,4.68E-01,4.63E-01,4.43E-01 +1238,4.67E-01,4.68E-01,4.47E-01 +1239,4.62E-01,4.63E-01,4.42E-01 +1240,4.60E-01,4.61E-01,4.40E-01 +1241,4.64E-01,4.62E-01,4.41E-01 +1242,4.62E-01,4.62E-01,4.42E-01 +1243,4.57E-01,4.58E-01,4.37E-01 +1244,4.55E-01,4.55E-01,4.35E-01 +1245,4.56E-01,4.57E-01,4.36E-01 +1246,4.59E-01,4.59E-01,4.39E-01 +1247,4.58E-01,4.57E-01,4.37E-01 +1248,4.61E-01,4.59E-01,4.38E-01 +1249,4.60E-01,4.60E-01,4.39E-01 +1250,4.59E-01,4.57E-01,4.37E-01 +1251,4.56E-01,4.53E-01,4.33E-01 +1252,4.52E-01,4.51E-01,4.31E-01 +1253,4.54E-01,4.48E-01,4.28E-01 +1254,4.54E-01,4.44E-01,4.24E-01 +1255,4.53E-01,4.51E-01,4.31E-01 +1256,4.52E-01,4.40E-01,4.21E-01 +1257,4.49E-01,4.35E-01,4.16E-01 +1258,4.51E-01,4.45E-01,4.25E-01 +1259,4.48E-01,4.27E-01,4.09E-01 +1260,4.50E-01,4.31E-01,4.12E-01 +1261,4.49E-01,4.11E-01,3.94E-01 +1262,4.43E-01,3.96E-01,3.79E-01 +1263,4.48E-01,4.00E-01,3.83E-01 +1264,4.42E-01,3.71E-01,3.56E-01 +1265,4.43E-01,3.96E-01,3.79E-01 +1266,4.46E-01,3.85E-01,3.69E-01 +1267,4.39E-01,3.88E-01,3.72E-01 +1268,4.36E-01,3.71E-01,3.55E-01 +1269,4.40E-01,2.47E-01,2.37E-01 +1270,4.42E-01,3.87E-01,3.71E-01 +1271,4.43E-01,4.08E-01,3.91E-01 +1272,4.41E-01,4.09E-01,3.91E-01 +1273,4.41E-01,4.06E-01,3.89E-01 +1274,4.38E-01,4.06E-01,3.89E-01 +1275,4.41E-01,4.12E-01,3.95E-01 +1276,4.42E-01,4.17E-01,3.99E-01 +1277,4.42E-01,4.20E-01,4.02E-01 +1278,4.41E-01,4.28E-01,4.09E-01 +1279,4.38E-01,4.25E-01,4.06E-01 +1280,4.35E-01,4.22E-01,4.04E-01 +1281,4.23E-01,4.13E-01,3.96E-01 +1282,3.76E-01,3.73E-01,3.57E-01 +1283,4.12E-01,4.07E-01,3.90E-01 +1284,4.27E-01,4.21E-01,4.03E-01 +1285,4.29E-01,4.24E-01,4.06E-01 +1286,4.29E-01,4.27E-01,4.09E-01 +1287,4.30E-01,4.22E-01,4.04E-01 +1288,4.27E-01,4.20E-01,4.02E-01 +1289,4.28E-01,4.09E-01,3.92E-01 +1290,4.19E-01,4.13E-01,3.95E-01 +1291,4.22E-01,4.18E-01,4.00E-01 +1292,4.23E-01,3.96E-01,3.79E-01 +1293,4.23E-01,4.13E-01,3.95E-01 +1294,4.16E-01,4.04E-01,3.87E-01 +1295,4.19E-01,4.05E-01,3.88E-01 +1296,4.20E-01,3.90E-01,3.73E-01 +1297,4.17E-01,3.71E-01,3.56E-01 +1298,4.13E-01,3.92E-01,3.75E-01 +1299,4.17E-01,4.09E-01,3.91E-01 +1300,4.15E-01,3.53E-01,3.39E-01 +1301,4.14E-01,3.62E-01,3.47E-01 +1302,4.10E-01,3.92E-01,3.75E-01 +1303,4.08E-01,3.46E-01,3.32E-01 +1304,4.06E-01,3.01E-01,2.88E-01 +1305,4.10E-01,3.84E-01,3.68E-01 +1306,4.10E-01,3.85E-01,3.69E-01 +1307,4.10E-01,3.06E-01,2.94E-01 +1308,4.09E-01,3.47E-01,3.33E-01 +1309,4.09E-01,3.84E-01,3.68E-01 +1310,4.07E-01,3.01E-01,2.89E-01 +1311,4.06E-01,3.34E-01,3.20E-01 +1312,4.03E-01,3.33E-01,3.20E-01 +1313,3.91E-01,3.14E-01,3.01E-01 +1314,4.03E-01,2.88E-01,2.77E-01 +1315,3.92E-01,2.86E-01,2.74E-01 +1316,3.94E-01,3.24E-01,3.11E-01 +1317,4.01E-01,3.12E-01,3.00E-01 +1318,3.95E-01,3.33E-01,3.20E-01 +1319,4.01E-01,2.69E-01,2.58E-01 +1320,3.99E-01,2.59E-01,2.49E-01 +1321,3.95E-01,2.99E-01,2.87E-01 +1322,3.95E-01,3.02E-01,2.90E-01 +1323,3.95E-01,2.33E-01,2.24E-01 +1324,3.95E-01,2.62E-01,2.52E-01 +1325,3.94E-01,3.22E-01,3.09E-01 +1326,3.92E-01,2.81E-01,2.70E-01 +1327,3.89E-01,2.66E-01,2.56E-01 +1328,3.91E-01,2.35E-01,2.26E-01 +1329,3.80E-01,1.78E-01,1.71E-01 +1330,3.85E-01,2.29E-01,2.21E-01 +1331,3.88E-01,1.45E-01,1.40E-01 +1332,3.79E-01,1.46E-01,1.40E-01 +1333,3.87E-01,2.03E-01,1.95E-01 +1334,3.87E-01,1.69E-01,1.63E-01 +1335,3.86E-01,2.31E-01,2.22E-01 +1336,3.82E-01,1.83E-01,1.77E-01 +1337,3.83E-01,1.65E-01,1.59E-01 +1338,3.81E-01,1.78E-01,1.72E-01 +1339,3.76E-01,1.77E-01,1.70E-01 +1340,3.74E-01,1.68E-01,1.62E-01 +1341,3.82E-01,1.70E-01,1.64E-01 +1342,3.80E-01,1.78E-01,1.71E-01 +1343,3.80E-01,1.27E-01,1.23E-01 +1344,3.80E-01,7.56E-02,7.30E-02 +1345,3.80E-01,1.09E-01,1.05E-01 +1346,3.76E-01,5.82E-02,5.62E-02 +1347,3.78E-01,6.01E-02,5.81E-02 +1348,3.77E-01,4.75E-03,4.59E-03 +1349,3.76E-01,1.62E-02,1.56E-02 +1350,3.71E-01,1.60E-02,1.55E-02 +1351,3.72E-01,4.63E-03,4.48E-03 +1352,3.75E-01,1.52E-03,1.47E-03 +1353,3.74E-01,9.61E-05,9.29E-05 +1354,3.73E-01,2.90E-04,2.81E-04 +1355,3.68E-01,3.60E-06,3.48E-06 +1356,3.69E-01,4.81E-05,4.65E-05 +1357,3.64E-01,7.18E-05,6.94E-05 +1358,3.70E-01,4.19E-06,4.06E-06 +1359,3.69E-01,7.34E-07,7.10E-07 +1360,3.65E-01,2.14E-06,2.07E-06 +1361,3.70E-01,4.81E-09,4.66E-09 +1362,3.69E-01,1.81E-11,1.75E-11 +1363,3.62E-01,3.16E-06,3.05E-06 +1364,3.67E-01,1.36E-06,1.32E-06 +1365,3.66E-01,9.08E-12,8.78E-12 +1366,3.66E-01,1.28E-05,1.24E-05 +1367,3.62E-01,4.98E-06,4.82E-06 +1368,3.66E-01,1.48E-13,1.43E-13 +1369,3.59E-01,5.17E-07,5.00E-07 +1370,3.59E-01,2.92E-07,2.83E-07 +1371,3.59E-01,1.97E-08,1.91E-08 +1372,3.63E-01,2.75E-06,2.66E-06 +1373,3.63E-01,4.44E-05,4.30E-05 +1374,3.63E-01,1.79E-04,1.74E-04 +1375,3.57E-01,3.23E-04,3.13E-04 +1376,3.54E-01,2.57E-04,2.49E-04 +1377,3.58E-01,1.23E-04,1.19E-04 +1378,3.57E-01,1.11E-03,1.07E-03 +1379,3.60E-01,5.22E-05,5.05E-05 +1380,3.57E-01,8.16E-05,7.90E-05 +1381,3.58E-01,2.37E-06,2.30E-06 +1382,3.53E-01,2.57E-06,2.49E-06 +1383,3.54E-01,4.40E-08,4.27E-08 +1384,3.56E-01,6.17E-07,5.98E-07 +1385,3.52E-01,2.09E-06,2.03E-06 +1386,3.55E-01,2.52E-06,2.44E-06 +1387,3.51E-01,1.99E-04,1.93E-04 +1388,3.53E-01,4.03E-06,3.90E-06 +1389,3.54E-01,5.81E-04,5.63E-04 +1390,3.47E-01,4.93E-04,4.78E-04 +1391,3.52E-01,3.44E-04,3.33E-04 +1392,3.52E-01,2.38E-05,2.31E-05 +1393,3.50E-01,1.16E-04,1.12E-04 +1394,3.48E-01,7.55E-05,7.33E-05 +1395,3.48E-01,6.71E-07,6.51E-07 +1396,3.49E-01,6.32E-09,6.13E-09 +1397,3.49E-01,4.91E-05,4.76E-05 +1398,3.50E-01,1.27E-03,1.23E-03 +1399,3.49E-01,8.12E-04,7.88E-04 +1400,3.39E-01,3.25E-09,3.15E-09 +1401,3.39E-01,1.05E-08,1.02E-08 +1402,3.44E-01,1.84E-03,1.78E-03 +1403,3.40E-01,2.38E-03,2.31E-03 +1404,3.41E-01,7.39E-04,7.18E-04 +1405,3.40E-01,3.64E-07,3.54E-07 +1406,3.42E-01,2.04E-03,1.99E-03 +1407,3.41E-01,1.75E-04,1.70E-04 +1408,3.40E-01,1.65E-03,1.60E-03 +1409,3.41E-01,6.19E-04,6.02E-04 +1410,3.40E-01,4.67E-04,4.53E-04 +1411,3.38E-01,2.11E-03,2.05E-03 +1412,3.29E-01,2.64E-03,2.57E-03 +1413,3.33E-01,2.34E-02,2.27E-02 +1414,3.37E-01,3.64E-04,3.54E-04 +1415,3.37E-01,1.84E-04,1.79E-04 +1416,3.35E-01,3.56E-02,3.46E-02 +1417,3.37E-01,1.18E-02,1.14E-02 +1418,3.38E-01,1.36E-02,1.32E-02 +1419,3.34E-01,2.14E-03,2.09E-03 +1420,3.33E-01,8.27E-03,8.04E-03 +1421,3.36E-01,9.16E-03,8.91E-03 +1422,3.29E-01,4.63E-02,4.50E-02 +1423,3.29E-01,9.22E-03,8.97E-03 +1424,3.28E-01,1.70E-02,1.65E-02 +1425,3.33E-01,2.59E-02,2.51E-02 +1426,3.23E-01,2.78E-02,2.70E-02 +1427,3.27E-01,4.95E-02,4.82E-02 +1428,3.30E-01,4.56E-03,4.44E-03 +1429,3.23E-01,3.80E-02,3.70E-02 +1430,3.23E-01,6.16E-02,5.99E-02 +1431,3.24E-01,5.02E-02,4.88E-02 +1432,3.31E-01,2.52E-03,2.45E-03 +1433,3.31E-01,3.58E-02,3.49E-02 +1434,3.25E-01,2.10E-02,2.04E-02 +1435,3.27E-01,2.14E-02,2.08E-02 +1436,3.27E-01,3.84E-02,3.73E-02 +1437,3.28E-01,2.99E-02,2.91E-02 +1438,3.26E-01,1.33E-02,1.29E-02 +1439,3.29E-01,5.10E-02,4.97E-02 +1440,3.13E-01,3.96E-02,3.85E-02 +1441,3.17E-01,3.18E-02,3.10E-02 +1442,3.16E-01,3.63E-02,3.54E-02 +1443,3.18E-01,4.51E-02,4.39E-02 +1444,3.19E-01,6.18E-02,6.01E-02 +1445,3.19E-01,4.98E-02,4.84E-02 +1446,3.21E-01,2.31E-02,2.25E-02 +1447,3.18E-01,3.62E-02,3.53E-02 +1448,3.21E-01,1.16E-01,1.13E-01 +1449,3.20E-01,1.02E-01,9.94E-02 +1450,3.18E-01,2.74E-02,2.67E-02 +1451,3.14E-01,1.13E-02,1.10E-02 +1452,3.14E-01,6.24E-02,6.07E-02 +1453,3.15E-01,8.20E-02,7.98E-02 +1454,3.13E-01,1.38E-01,1.34E-01 +1455,3.12E-01,6.62E-02,6.44E-02 +1456,3.10E-01,8.85E-02,8.62E-02 +1457,3.12E-01,1.17E-01,1.14E-01 +1458,3.16E-01,1.36E-01,1.33E-01 +1459,3.17E-01,1.63E-01,1.59E-01 +1460,3.14E-01,8.54E-02,8.32E-02 +1461,3.13E-01,9.03E-02,8.79E-02 +1462,3.10E-01,1.31E-01,1.27E-01 +1463,3.08E-01,4.32E-02,4.21E-02 +1464,3.08E-01,1.52E-01,1.48E-01 +1465,3.12E-01,9.34E-02,9.09E-02 +1466,3.07E-01,6.52E-02,6.35E-02 +1467,3.13E-01,3.61E-02,3.51E-02 +1468,3.08E-01,7.69E-02,7.49E-02 +1469,3.12E-01,9.48E-02,9.23E-02 +1470,3.10E-01,4.97E-02,4.84E-02 +1471,3.04E-01,1.78E-02,1.74E-02 +1472,3.06E-01,4.68E-02,4.56E-02 +1473,3.06E-01,7.02E-02,6.84E-02 +1474,2.97E-01,9.73E-02,9.48E-02 +1475,3.03E-01,1.85E-01,1.80E-01 +1476,3.04E-01,6.88E-02,6.70E-02 +1477,3.03E-01,6.97E-02,6.79E-02 +1478,3.02E-01,6.35E-02,6.18E-02 +1479,3.05E-01,1.20E-01,1.17E-01 +1480,3.06E-01,6.06E-02,5.91E-02 +1481,3.02E-01,1.15E-01,1.12E-01 +1482,3.05E-01,5.85E-02,5.70E-02 +1483,2.98E-01,1.49E-01,1.45E-01 +1484,3.02E-01,1.37E-01,1.34E-01 +1485,3.06E-01,1.25E-01,1.22E-01 +1486,3.02E-01,1.23E-01,1.20E-01 +1487,3.00E-01,6.06E-02,5.90E-02 +1488,2.65E-01,9.42E-02,9.17E-02 +1489,2.99E-01,1.90E-01,1.84E-01 +1490,3.01E-01,1.75E-01,1.70E-01 +1491,3.02E-01,1.98E-01,1.92E-01 +1492,2.98E-01,1.64E-01,1.60E-01 +1493,3.02E-01,1.82E-01,1.77E-01 +1494,3.02E-01,2.04E-01,1.98E-01 +1495,3.01E-01,1.83E-01,1.77E-01 +1496,2.91E-01,1.69E-01,1.64E-01 +1497,2.97E-01,2.29E-01,2.22E-01 +1498,2.99E-01,1.90E-01,1.84E-01 +1499,2.95E-01,2.18E-01,2.11E-01 +1500,3.01E-01,2.51E-01,2.43E-01 +1501,3.00E-01,2.66E-01,2.58E-01 +1502,2.97E-01,2.34E-01,2.27E-01 +1503,2.69E-01,1.85E-01,1.80E-01 +1504,2.83E-01,1.60E-01,1.56E-01 +1505,2.71E-01,1.84E-01,1.79E-01 +1506,2.84E-01,2.58E-01,2.50E-01 +1507,2.94E-01,2.55E-01,2.48E-01 +1508,2.90E-01,2.43E-01,2.36E-01 +1509,2.88E-01,1.87E-01,1.82E-01 +1510,2.94E-01,2.71E-01,2.63E-01 +1511,2.94E-01,2.65E-01,2.57E-01 +1512,2.88E-01,2.61E-01,2.53E-01 +1513,2.87E-01,2.42E-01,2.35E-01 +1514,2.85E-01,2.26E-01,2.19E-01 +1515,2.88E-01,2.66E-01,2.58E-01 +1516,2.87E-01,2.57E-01,2.49E-01 +1517,2.85E-01,2.49E-01,2.42E-01 +1518,2.90E-01,2.52E-01,2.45E-01 +1519,2.85E-01,2.44E-01,2.37E-01 +1520,2.88E-01,2.65E-01,2.57E-01 +1521,2.81E-01,2.75E-01,2.67E-01 +1522,2.80E-01,2.64E-01,2.56E-01 +1523,2.84E-01,2.80E-01,2.72E-01 +1524,2.85E-01,2.75E-01,2.67E-01 +1525,2.78E-01,2.59E-01,2.51E-01 +1526,2.86E-01,2.67E-01,2.60E-01 +1527,2.83E-01,2.62E-01,2.55E-01 +1528,2.85E-01,2.79E-01,2.71E-01 +1529,2.83E-01,2.72E-01,2.65E-01 +1530,2.67E-01,2.55E-01,2.48E-01 +1531,2.83E-01,2.70E-01,2.62E-01 +1532,2.83E-01,2.78E-01,2.70E-01 +1533,2.80E-01,2.77E-01,2.69E-01 +1534,2.75E-01,2.69E-01,2.61E-01 +1535,2.78E-01,2.67E-01,2.59E-01 +1536,2.81E-01,2.75E-01,2.67E-01 +1537,2.81E-01,2.73E-01,2.66E-01 +1538,2.73E-01,2.72E-01,2.64E-01 +1539,2.78E-01,2.73E-01,2.65E-01 +1540,2.69E-01,2.65E-01,2.57E-01 +1541,2.73E-01,2.69E-01,2.61E-01 +1542,2.75E-01,2.69E-01,2.62E-01 +1543,2.75E-01,2.72E-01,2.64E-01 +1544,2.77E-01,2.72E-01,2.64E-01 +1545,2.78E-01,2.77E-01,2.69E-01 +1546,2.77E-01,2.75E-01,2.67E-01 +1547,2.74E-01,2.73E-01,2.65E-01 +1548,2.67E-01,2.67E-01,2.59E-01 +1549,2.73E-01,2.73E-01,2.66E-01 +1550,2.70E-01,2.70E-01,2.62E-01 +1551,2.71E-01,2.71E-01,2.63E-01 +1552,2.74E-01,2.72E-01,2.64E-01 +1553,2.71E-01,2.71E-01,2.64E-01 +1554,2.65E-01,2.65E-01,2.57E-01 +1555,2.67E-01,2.68E-01,2.60E-01 +1556,2.63E-01,2.63E-01,2.56E-01 +1557,2.70E-01,2.71E-01,2.63E-01 +1558,2.68E-01,2.68E-01,2.61E-01 +1559,2.68E-01,2.68E-01,2.61E-01 +1560,2.65E-01,2.66E-01,2.58E-01 +1561,2.70E-01,2.70E-01,2.62E-01 +1562,2.68E-01,2.68E-01,2.60E-01 +1563,2.67E-01,2.67E-01,2.59E-01 +1564,2.63E-01,2.63E-01,2.55E-01 +1565,2.67E-01,2.67E-01,2.60E-01 +1566,2.63E-01,2.62E-01,2.55E-01 +1567,2.64E-01,2.63E-01,2.56E-01 +1568,2.60E-01,2.57E-01,2.50E-01 +1569,2.63E-01,2.55E-01,2.47E-01 +1570,2.61E-01,2.42E-01,2.35E-01 +1571,2.67E-01,2.35E-01,2.29E-01 +1572,2.67E-01,2.38E-01,2.31E-01 +1573,2.63E-01,2.34E-01,2.28E-01 +1574,2.62E-01,2.41E-01,2.35E-01 +1575,2.47E-01,2.40E-01,2.33E-01 +1576,2.60E-01,2.47E-01,2.40E-01 +1577,2.37E-01,2.16E-01,2.10E-01 +1578,2.57E-01,2.35E-01,2.29E-01 +1579,2.62E-01,2.37E-01,2.30E-01 +1580,2.64E-01,2.45E-01,2.38E-01 +1581,2.65E-01,2.49E-01,2.42E-01 +1582,2.54E-01,2.42E-01,2.35E-01 +1583,2.58E-01,2.48E-01,2.41E-01 +1584,2.54E-01,2.49E-01,2.42E-01 +1585,2.62E-01,2.59E-01,2.51E-01 +1586,2.58E-01,2.56E-01,2.48E-01 +1587,2.55E-01,2.53E-01,2.46E-01 +1588,2.50E-01,2.51E-01,2.44E-01 +1589,2.32E-01,2.32E-01,2.26E-01 +1590,2.42E-01,2.42E-01,2.35E-01 +1591,2.41E-01,2.42E-01,2.35E-01 +1592,2.53E-01,2.52E-01,2.45E-01 +1593,2.58E-01,2.58E-01,2.51E-01 +1594,2.56E-01,2.56E-01,2.49E-01 +1595,2.58E-01,2.58E-01,2.51E-01 +1596,2.45E-01,2.45E-01,2.38E-01 +1597,2.49E-01,2.47E-01,2.40E-01 +1598,2.56E-01,2.54E-01,2.47E-01 +1599,2.50E-01,2.42E-01,2.35E-01 +1600,2.53E-01,2.38E-01,2.31E-01 +1601,2.45E-01,2.23E-01,2.17E-01 +1602,2.49E-01,2.24E-01,2.18E-01 +1603,2.49E-01,2.24E-01,2.18E-01 +1604,2.50E-01,2.28E-01,2.22E-01 +1605,2.47E-01,2.37E-01,2.30E-01 +1606,2.47E-01,2.41E-01,2.35E-01 +1607,2.45E-01,2.33E-01,2.26E-01 +1608,2.50E-01,2.30E-01,2.23E-01 +1609,2.49E-01,2.27E-01,2.21E-01 +1610,2.33E-01,2.18E-01,2.11E-01 +1611,2.41E-01,2.27E-01,2.20E-01 +1612,2.41E-01,2.31E-01,2.24E-01 +1613,2.46E-01,2.37E-01,2.30E-01 +1614,2.44E-01,2.38E-01,2.32E-01 +1615,2.44E-01,2.41E-01,2.34E-01 +1616,2.32E-01,2.31E-01,2.24E-01 +1617,2.36E-01,2.35E-01,2.28E-01 +1618,2.44E-01,2.44E-01,2.37E-01 +1619,2.42E-01,2.41E-01,2.34E-01 +1620,2.34E-01,2.34E-01,2.28E-01 +1621,2.34E-01,2.34E-01,2.28E-01 +1622,2.37E-01,2.38E-01,2.31E-01 +1623,2.42E-01,2.42E-01,2.36E-01 +1624,2.42E-01,2.43E-01,2.36E-01 +1625,2.37E-01,2.38E-01,2.31E-01 +1626,2.40E-01,2.40E-01,2.33E-01 +1627,2.40E-01,2.41E-01,2.34E-01 +1628,2.41E-01,2.41E-01,2.34E-01 +1629,2.41E-01,2.41E-01,2.35E-01 +1630,2.37E-01,2.37E-01,2.30E-01 +1631,2.39E-01,2.38E-01,2.31E-01 +1632,2.39E-01,2.38E-01,2.32E-01 +1633,2.36E-01,2.33E-01,2.26E-01 +1634,2.33E-01,2.33E-01,2.26E-01 +1635,2.37E-01,2.34E-01,2.27E-01 +1636,2.37E-01,2.35E-01,2.29E-01 +1637,2.27E-01,2.27E-01,2.21E-01 +1638,2.27E-01,2.20E-01,2.14E-01 +1639,2.22E-01,2.20E-01,2.14E-01 +1640,2.26E-01,2.15E-01,2.09E-01 +1641,2.24E-01,2.20E-01,2.13E-01 +1642,2.24E-01,2.21E-01,2.15E-01 +1643,2.29E-01,2.15E-01,2.09E-01 +1644,2.26E-01,2.24E-01,2.17E-01 +1645,2.25E-01,2.18E-01,2.12E-01 +1646,2.29E-01,2.17E-01,2.11E-01 +1647,2.29E-01,2.28E-01,2.21E-01 +1648,2.29E-01,2.17E-01,2.11E-01 +1649,2.24E-01,2.19E-01,2.13E-01 +1650,2.28E-01,2.25E-01,2.19E-01 +1651,2.24E-01,2.09E-01,2.03E-01 +1652,2.28E-01,2.24E-01,2.18E-01 +1653,2.25E-01,2.23E-01,2.17E-01 +1654,2.27E-01,2.16E-01,2.10E-01 +1655,2.24E-01,2.22E-01,2.16E-01 +1656,2.26E-01,2.21E-01,2.15E-01 +1657,2.26E-01,2.22E-01,2.16E-01 +1658,2.25E-01,2.25E-01,2.19E-01 +1659,2.22E-01,2.21E-01,2.15E-01 +1660,2.24E-01,2.23E-01,2.17E-01 +1661,2.25E-01,2.24E-01,2.18E-01 +1662,2.24E-01,2.19E-01,2.13E-01 +1663,2.23E-01,2.22E-01,2.16E-01 +1664,2.23E-01,2.21E-01,2.15E-01 +1665,2.21E-01,2.12E-01,2.06E-01 +1666,2.19E-01,1.79E-01,1.74E-01 +1667,2.20E-01,2.11E-01,2.05E-01 +1668,2.16E-01,2.15E-01,2.09E-01 +1669,2.18E-01,2.15E-01,2.09E-01 +1670,2.22E-01,2.22E-01,2.16E-01 +1671,2.21E-01,2.19E-01,2.13E-01 +1672,2.12E-01,2.11E-01,2.06E-01 +1673,2.16E-01,2.16E-01,2.11E-01 +1674,2.19E-01,2.16E-01,2.10E-01 +1675,2.16E-01,2.14E-01,2.08E-01 +1676,2.13E-01,2.11E-01,2.06E-01 +1677,2.15E-01,2.12E-01,2.07E-01 +1678,2.16E-01,2.09E-01,2.04E-01 +1679,2.13E-01,2.13E-01,2.07E-01 +1680,2.06E-01,2.06E-01,2.00E-01 +1681,1.98E-01,1.94E-01,1.89E-01 +1682,2.03E-01,2.04E-01,1.98E-01 +1683,2.09E-01,2.09E-01,2.04E-01 +1684,2.12E-01,1.98E-01,1.93E-01 +1685,2.13E-01,2.13E-01,2.08E-01 +1686,2.10E-01,2.10E-01,2.05E-01 +1687,2.11E-01,2.05E-01,2.00E-01 +1688,2.11E-01,2.10E-01,2.05E-01 +1689,2.08E-01,2.07E-01,2.02E-01 +1690,2.08E-01,2.05E-01,2.00E-01 +1691,2.12E-01,1.93E-01,1.88E-01 +1692,2.12E-01,2.07E-01,2.02E-01 +1693,2.11E-01,2.11E-01,2.06E-01 +1694,2.11E-01,2.05E-01,2.00E-01 +1695,2.11E-01,2.10E-01,2.04E-01 +1696,2.10E-01,2.09E-01,2.04E-01 +1697,2.09E-01,1.81E-01,1.76E-01 +1698,2.09E-01,2.07E-01,2.02E-01 +1699,2.08E-01,2.06E-01,2.00E-01 +1700,2.05E-01,2.00E-01,1.95E-01 +1702,2.05E-01,2.04E-01,1.99E-01 +1705,2.04E-01,1.98E-01,1.93E-01 +1710,1.99E-01,1.88E-01,1.83E-01 +1715,2.02E-01,1.90E-01,1.85E-01 +1720,1.98E-01,1.87E-01,1.82E-01 +1725,1.97E-01,1.78E-01,1.74E-01 +1730,1.93E-01,1.74E-01,1.70E-01 +1735,1.82E-01,1.62E-01,1.58E-01 +1740,1.90E-01,1.68E-01,1.64E-01 +1745,1.86E-01,1.55E-01,1.51E-01 +1750,1.85E-01,1.66E-01,1.62E-01 +1755,1.85E-01,1.53E-01,1.49E-01 +1760,1.82E-01,1.60E-01,1.56E-01 +1765,1.81E-01,1.33E-01,1.30E-01 +1770,1.80E-01,1.42E-01,1.38E-01 +1775,1.76E-01,1.15E-01,1.12E-01 +1780,1.76E-01,1.01E-01,9.81E-02 +1785,1.74E-01,7.70E-02,7.52E-02 +1790,1.74E-01,8.89E-02,8.68E-02 +1795,1.71E-01,4.69E-02,4.59E-02 +1800,1.68E-01,3.18E-02,3.11E-02 +1805,1.69E-01,1.48E-02,1.45E-02 +1810,1.69E-01,9.69E-03,9.48E-03 +1815,1.55E-01,3.28E-03,3.21E-03 +1820,1.60E-01,9.88E-04,9.66E-04 +1825,1.63E-01,1.27E-03,1.25E-03 +1830,1.59E-01,5.20E-06,5.09E-06 +1835,1.58E-01,6.42E-06,6.28E-06 +1840,1.56E-01,6.27E-08,6.13E-08 +1845,1.53E-01,6.27E-06,6.13E-06 +1850,1.53E-01,3.00E-06,2.93E-06 +1855,1.51E-01,2.84E-07,2.78E-07 +1860,1.49E-01,1.12E-05,1.09E-05 +1865,1.47E-01,1.70E-05,1.66E-05 +1870,1.46E-01,2.67E-10,2.61E-10 +1875,1.32E-01,4.51E-10,4.43E-10 +1880,1.47E-01,7.75E-05,7.61E-05 +1885,1.46E-01,4.39E-05,4.31E-05 +1890,1.40E-01,2.23E-04,2.20E-04 +1895,1.38E-01,1.29E-04,1.27E-04 +1900,1.40E-01,8.62E-07,8.49E-07 +1905,1.39E-01,5.67E-07,5.58E-07 +1910,1.37E-01,2.30E-05,2.27E-05 +1915,1.36E-01,1.99E-05,1.97E-05 +1920,1.35E-01,4.51E-04,4.45E-04 +1925,1.34E-01,9.36E-04,9.23E-04 +1930,1.31E-01,5.52E-04,5.45E-04 +1935,1.32E-01,3.59E-03,3.54E-03 +1940,1.30E-01,3.28E-03,3.24E-03 +1945,1.20E-01,1.09E-02,1.07E-02 +1950,1.26E-01,1.67E-02,1.65E-02 +1955,1.28E-01,1.00E-02,9.89E-03 +1960,1.26E-01,2.19E-02,2.16E-02 +1965,1.23E-01,2.86E-02,2.81E-02 +1970,1.24E-01,4.88E-02,4.81E-02 +1975,1.22E-01,6.79E-02,6.67E-02 +1980,1.20E-01,7.55E-02,7.42E-02 +1985,1.19E-01,8.31E-02,8.16E-02 +1990,1.20E-01,8.56E-02,8.41E-02 +1995,1.17E-01,8.12E-02,7.98E-02 +2000,1.17E-01,3.82E-02,3.75E-02 +2005,1.15E-01,1.50E-02,1.47E-02 +2010,1.15E-01,3.97E-02,3.91E-02 +2015,1.14E-01,2.66E-02,2.62E-02 +2020,1.12E-01,4.50E-02,4.42E-02 +2025,1.12E-01,7.40E-02,7.28E-02 +2030,1.10E-01,8.49E-02,8.35E-02 +2035,1.09E-01,9.64E-02,9.48E-02 +2040,1.07E-01,8.98E-02,8.83E-02 +2045,1.08E-01,9.11E-02,8.96E-02 +2050,1.06E-01,6.79E-02,6.69E-02 +2055,1.05E-01,5.49E-02,5.41E-02 +2060,1.03E-01,6.92E-02,6.82E-02 +2065,1.02E-01,6.19E-02,6.10E-02 +2070,1.01E-01,6.57E-02,6.47E-02 +2075,1.01E-01,7.74E-02,7.63E-02 +2080,9.93E-02,8.68E-02,8.55E-02 +2085,9.83E-02,8.51E-02,8.38E-02 +2090,9.75E-02,8.91E-02,8.78E-02 +2095,9.60E-02,8.97E-02,8.84E-02 +2100,9.62E-02,8.61E-02,8.49E-02 +2105,9.58E-02,9.32E-02,9.18E-02 +2110,9.46E-02,8.97E-02,8.83E-02 +2115,9.39E-02,9.17E-02,9.03E-02 +2120,9.31E-02,8.76E-02,8.63E-02 +2125,9.22E-02,8.86E-02,8.73E-02 +2130,9.24E-02,8.98E-02,8.84E-02 +2135,9.11E-02,9.00E-02,8.87E-02 +2140,9.11E-02,9.08E-02,8.94E-02 +2145,8.99E-02,8.95E-02,8.81E-02 +2150,8.97E-02,8.46E-02,8.34E-02 +2155,8.89E-02,8.48E-02,8.36E-02 +2160,8.79E-02,8.42E-02,8.29E-02 +2165,8.20E-02,7.63E-02,7.52E-02 +2170,8.54E-02,8.20E-02,8.08E-02 +2175,8.58E-02,8.04E-02,7.93E-02 +2180,8.46E-02,8.18E-02,8.06E-02 +2185,8.47E-02,7.46E-02,7.35E-02 +2190,8.31E-02,7.91E-02,7.79E-02 +2195,8.35E-02,7.90E-02,7.78E-02 +2200,8.28E-02,7.12E-02,7.02E-02 +2205,8.09E-02,7.40E-02,7.29E-02 +2210,8.08E-02,7.93E-02,7.82E-02 +2215,8.04E-02,7.63E-02,7.52E-02 +2220,8.00E-02,7.77E-02,7.66E-02 +2225,7.88E-02,7.55E-02,7.44E-02 +2230,7.84E-02,7.58E-02,7.47E-02 +2235,7.79E-02,7.43E-02,7.33E-02 +2240,7.65E-02,7.31E-02,7.21E-02 +2245,7.63E-02,7.08E-02,6.99E-02 +2250,7.54E-02,7.19E-02,7.10E-02 +2255,7.43E-02,6.77E-02,6.69E-02 +2260,7.41E-02,6.69E-02,6.61E-02 +2265,7.33E-02,6.81E-02,6.74E-02 +2270,7.31E-02,6.49E-02,6.41E-02 +2275,7.26E-02,6.40E-02,6.33E-02 +2280,7.14E-02,6.63E-02,6.56E-02 +2285,7.14E-02,6.31E-02,6.24E-02 +2290,7.12E-02,6.32E-02,6.25E-02 +2295,6.93E-02,6.13E-02,6.06E-02 +2300,6.96E-02,5.88E-02,5.82E-02 +2305,6.94E-02,5.92E-02,5.85E-02 +2310,6.89E-02,6.39E-02,6.32E-02 +2315,6.82E-02,5.81E-02,5.75E-02 +2320,6.76E-02,5.20E-02,5.15E-02 +2325,6.56E-02,5.62E-02,5.56E-02 +2330,6.62E-02,5.68E-02,5.62E-02 +2335,6.57E-02,5.80E-02,5.74E-02 +2340,6.52E-02,4.58E-02,4.54E-02 +2345,6.51E-02,5.14E-02,5.09E-02 +2350,6.43E-02,4.15E-02,4.11E-02 +2355,6.26E-02,4.75E-02,4.70E-02 +2360,6.31E-02,5.02E-02,4.97E-02 +2365,6.30E-02,4.94E-02,4.89E-02 +2370,6.24E-02,3.08E-02,3.05E-02 +2375,6.14E-02,4.41E-02,4.37E-02 +2380,6.18E-02,4.26E-02,4.21E-02 +2385,5.91E-02,3.08E-02,3.05E-02 +2390,6.04E-02,3.71E-02,3.67E-02 +2395,6.01E-02,4.06E-02,4.02E-02 +2400,5.97E-02,4.42E-02,4.37E-02 +2405,5.94E-02,3.36E-02,3.33E-02 +2410,5.92E-02,3.38E-02,3.35E-02 +2415,5.70E-02,2.73E-02,2.71E-02 +2420,5.78E-02,2.66E-02,2.64E-02 +2425,5.73E-02,3.31E-02,3.28E-02 +2430,5.72E-02,4.51E-02,4.47E-02 +2435,5.65E-02,1.49E-02,1.48E-02 +2440,5.63E-02,4.32E-02,4.29E-02 +2445,5.56E-02,2.08E-02,2.07E-02 +2450,5.46E-02,1.36E-02,1.35E-02 +2455,5.42E-02,2.49E-02,2.47E-02 +2460,5.45E-02,3.34E-02,3.32E-02 +2465,5.43E-02,2.41E-02,2.40E-02 +2470,5.34E-02,1.67E-02,1.66E-02 +2475,5.34E-02,1.65E-02,1.64E-02 +2480,5.21E-02,8.04E-03,8.00E-03 +2485,5.18E-02,5.61E-03,5.58E-03 +2490,5.22E-02,3.51E-03,3.50E-03 +2495,4.89E-02,2.88E-03,2.86E-03 +2500,5.14E-02,7.06E-03,7.03E-03 +2505,5.08E-02,1.52E-03,1.51E-03 +2510,4.96E-02,2.22E-03,2.21E-03 +2515,4.88E-02,5.19E-04,5.16E-04 +2520,4.81E-02,3.71E-04,3.69E-04 +2525,4.77E-02,4.14E-05,4.12E-05 +2530,4.77E-02,6.36E-07,6.33E-07 +2535,4.71E-02,1.75E-07,1.74E-07 +2540,4.68E-02,3.77E-07,3.75E-07 +2545,4.66E-02,5.38E-11,5.35E-11 +2550,4.63E-02,2.82E-13,2.81E-13 +2555,4.59E-02,1.04E-09,1.04E-09 +2560,4.54E-02,3.10E-11,3.08E-11 +2565,4.52E-02,1.60E-14,1.58E-14 +2570,4.49E-02,1.53E-18,1.52E-18 +2575,4.45E-02,1.08E-27,1.07E-27 +2580,4.41E-02,3.82E-22,3.79E-22 +2585,4.33E-02,1.72E-34,1.71E-34 +2590,4.34E-02,5.48E-31,5.44E-31 +2595,4.30E-02,2.28E-33,2.27E-33 +2600,4.29E-02,4.49E-28,4.46E-28 +2605,4.28E-02,5.81E-35,5.76E-35 +2610,4.25E-02,5.94E-34,5.90E-34 +2615,4.23E-02,1.12E-37,1.11E-37 +2620,4.19E-02,5.65E-29,5.61E-29 +2625,4.06E-02,3.87E-28,3.84E-28 +2630,4.12E-02,2.80E-45,2.80E-45 +2635,4.10E-02,3.90E-16,3.87E-16 +2640,4.02E-02,1.18E-16,1.17E-16 +2645,4.02E-02,9.00E-19,8.93E-19 +2650,4.00E-02,1.43E-19,1.42E-19 +2655,3.96E-02,1.31E-27,1.30E-27 +2660,3.95E-02,2.61E-25,2.59E-25 +2665,3.90E-02,1.11E-37,1.10E-37 +2670,3.91E-02,0.00E+00,0.00E+00 +2675,3.86E-02,0.00E+00,0.00E+00 +2680,3.84E-02,0.00E+00,0.00E+00 +2685,3.82E-02,0.00E+00,0.00E+00 +2690,3.78E-02,1.02E-29,1.02E-29 +2695,3.75E-02,7.13E-33,7.10E-33 +2700,3.71E-02,0.00E+00,0.00E+00 +2705,3.69E-02,2.93E-42,2.93E-42 +2710,3.67E-02,1.13E-35,1.12E-35 +2715,3.66E-02,3.86E-26,3.85E-26 +2720,3.64E-02,5.61E-45,5.61E-45 +2725,3.61E-02,7.29E-22,7.31E-22 +2730,3.60E-02,6.07E-19,6.09E-19 +2735,3.57E-02,5.49E-21,5.51E-21 +2740,3.55E-02,2.33E-27,2.34E-27 +2745,3.54E-02,1.31E-23,1.32E-23 +2750,3.52E-02,1.66E-28,1.68E-28 +2755,3.49E-02,6.73E-44,6.73E-44 +2760,3.46E-02,0.00E+00,0.00E+00 +2765,3.44E-02,2.68E-27,2.70E-27 +2770,3.43E-02,8.38E-24,8.45E-24 +2775,3.39E-02,4.00E-38,4.04E-38 +2780,3.36E-02,4.81E-34,4.85E-34 +2785,3.34E-02,3.89E-27,3.93E-27 +2790,3.32E-02,1.22E-16,1.23E-16 +2795,3.29E-02,3.62E-16,3.66E-16 +2800,3.28E-02,1.65E-12,1.67E-12 +2805,3.25E-02,6.75E-14,6.82E-14 +2810,3.24E-02,4.02E-10,4.07E-10 +2815,3.23E-02,2.87E-10,2.90E-10 +2820,3.21E-02,2.05E-11,2.08E-11 +2825,3.18E-02,1.76E-07,1.78E-07 +2830,3.17E-02,3.90E-06,3.95E-06 +2835,3.15E-02,2.13E-10,2.15E-10 +2840,3.12E-02,1.96E-07,1.98E-07 +2845,3.10E-02,4.06E-05,4.11E-05 +2850,3.07E-02,1.16E-06,1.17E-06 +2855,3.04E-02,4.49E-07,4.54E-07 +2860,3.02E-02,2.54E-05,2.57E-05 +2865,3.00E-02,1.68E-04,1.70E-04 +2870,2.96E-02,6.31E-06,6.39E-06 +2875,2.94E-02,3.92E-04,3.97E-04 +2880,2.94E-02,2.47E-04,2.50E-04 +2885,2.92E-02,4.53E-04,4.59E-04 +2890,2.91E-02,1.86E-04,1.89E-04 +2895,2.90E-02,2.66E-03,2.70E-03 +2900,2.88E-02,8.12E-04,8.22E-04 +2905,2.87E-02,1.11E-04,1.12E-04 +2910,2.85E-02,2.72E-03,2.76E-03 +2915,2.82E-02,1.26E-03,1.27E-03 +2920,2.80E-02,2.89E-03,2.93E-03 +2925,2.78E-02,1.08E-03,1.10E-03 +2930,2.76E-02,5.89E-03,5.96E-03 +2935,2.73E-02,6.49E-03,6.57E-03 +2940,2.71E-02,1.63E-03,1.65E-03 +2945,2.68E-02,1.45E-03,1.47E-03 +2950,2.67E-02,5.23E-03,5.29E-03 +2955,2.66E-02,2.34E-03,2.37E-03 +2960,2.64E-02,4.60E-03,4.65E-03 +2965,2.63E-02,7.44E-03,7.53E-03 +2970,2.61E-02,3.52E-04,3.57E-04 +2975,2.60E-02,8.54E-04,8.65E-04 +2980,2.58E-02,1.34E-03,1.35E-03 +2985,2.57E-02,6.96E-03,7.05E-03 +2990,2.55E-02,1.03E-02,1.04E-02 +2995,2.54E-02,4.28E-03,4.33E-03 +3000,2.53E-02,7.85E-03,7.94E-03 +3005,2.51E-02,2.89E-03,2.93E-03 +3010,2.50E-02,6.85E-03,6.93E-03 +3015,2.49E-02,5.56E-03,5.62E-03 +3020,2.47E-02,6.34E-04,6.41E-04 +3025,2.45E-02,7.50E-03,7.59E-03 +3030,2.44E-02,6.08E-03,6.15E-03 +3035,2.42E-02,2.50E-03,2.53E-03 +3040,2.39E-02,2.02E-03,2.05E-03 +3045,2.40E-02,4.21E-03,4.26E-03 +3050,2.40E-02,1.03E-03,1.04E-03 +3055,2.39E-02,2.89E-04,2.93E-04 +3060,2.38E-02,6.30E-03,6.38E-03 +3065,2.35E-02,2.91E-03,2.95E-03 +3070,2.34E-02,1.75E-03,1.77E-03 +3075,2.34E-02,6.02E-03,6.09E-03 +3080,2.32E-02,3.62E-03,3.66E-03 +3085,2.30E-02,1.77E-03,1.79E-03 +3090,2.28E-02,2.38E-03,2.41E-03 +3095,2.26E-02,6.55E-04,6.63E-04 +3100,2.24E-02,4.40E-03,4.45E-03 +3105,2.23E-02,9.22E-04,9.32E-04 +3110,2.21E-02,8.46E-04,8.55E-04 +3115,2.18E-02,2.27E-03,2.29E-03 +3120,2.17E-02,9.82E-03,9.93E-03 +3125,2.16E-02,3.03E-03,3.06E-03 +3130,2.15E-02,5.76E-03,5.82E-03 +3135,2.14E-02,1.14E-02,1.16E-02 +3140,2.12E-02,3.32E-03,3.36E-03 +3145,2.11E-02,3.25E-03,3.29E-03 +3150,2.09E-02,6.67E-03,6.75E-03 +3155,2.08E-02,5.64E-03,5.70E-03 +3160,2.07E-02,9.23E-03,9.33E-03 +3165,2.07E-02,1.40E-02,1.42E-02 +3170,2.05E-02,1.25E-02,1.26E-02 +3175,2.05E-02,9.23E-03,9.33E-03 +3180,2.03E-02,1.06E-02,1.07E-02 +3185,2.02E-02,8.08E-03,8.16E-03 +3190,2.02E-02,4.24E-03,4.28E-03 +3195,2.01E-02,2.69E-03,2.72E-03 +3200,1.99E-02,4.38E-04,4.43E-04 +3205,1.99E-02,3.10E-04,3.13E-04 +3210,1.98E-02,1.36E-04,1.38E-04 +3215,1.96E-02,4.98E-04,5.02E-04 +3220,1.95E-02,1.61E-03,1.62E-03 +3225,1.94E-02,1.99E-04,2.01E-04 +3230,1.94E-02,3.41E-04,3.44E-04 +3235,1.93E-02,7.29E-03,7.36E-03 +3240,1.92E-02,3.75E-03,3.78E-03 +3245,1.91E-02,7.34E-04,7.41E-04 +3250,1.91E-02,2.61E-03,2.63E-03 +3255,1.89E-02,9.94E-03,1.00E-02 +3260,1.88E-02,1.22E-03,1.24E-03 +3265,1.87E-02,2.45E-03,2.47E-03 +3270,1.86E-02,1.22E-03,1.23E-03 +3275,1.85E-02,5.93E-03,5.98E-03 +3280,1.84E-02,2.86E-03,2.89E-03 +3285,1.83E-02,1.11E-02,1.12E-02 +3290,1.83E-02,8.76E-03,8.83E-03 +3295,1.80E-02,1.22E-03,1.23E-03 +3300,1.79E-02,1.78E-03,1.79E-03 +3305,1.79E-02,3.94E-03,3.97E-03 +3310,1.77E-02,3.92E-03,3.96E-03 +3315,1.76E-02,1.61E-05,1.63E-05 +3320,1.73E-02,6.00E-05,6.05E-05 +3325,1.73E-02,3.52E-03,3.55E-03 +3330,1.71E-02,4.66E-03,4.70E-03 +3335,1.70E-02,9.07E-03,9.15E-03 +3340,1.69E-02,3.46E-03,3.49E-03 +3345,1.68E-02,3.54E-03,3.57E-03 +3350,1.66E-02,8.03E-03,8.10E-03 +3355,1.65E-02,3.63E-03,3.66E-03 +3360,1.64E-02,5.24E-03,5.29E-03 +3365,1.63E-02,7.19E-03,7.26E-03 +3370,1.62E-02,3.94E-03,3.98E-03 +3375,1.61E-02,8.46E-03,8.54E-03 +3380,1.60E-02,5.11E-03,5.16E-03 +3385,1.60E-02,7.49E-03,7.57E-03 +3390,1.59E-02,9.86E-03,9.96E-03 +3395,1.58E-02,9.55E-03,9.64E-03 +3400,1.56E-02,1.25E-02,1.26E-02 +3405,1.57E-02,4.46E-03,4.51E-03 +3410,1.55E-02,7.08E-03,7.15E-03 +3415,1.55E-02,7.28E-03,7.35E-03 +3420,1.54E-02,1.32E-02,1.33E-02 +3425,1.53E-02,1.00E-02,1.01E-02 +3430,1.52E-02,8.69E-03,8.78E-03 +3435,1.52E-02,1.16E-02,1.17E-02 +3440,1.51E-02,8.03E-03,8.12E-03 +3445,1.50E-02,1.13E-02,1.14E-02 +3450,1.49E-02,1.12E-02,1.13E-02 +3455,1.49E-02,8.31E-03,8.39E-03 +3460,1.48E-02,1.25E-02,1.27E-02 +3465,1.48E-02,9.82E-03,9.92E-03 +3470,1.47E-02,1.23E-02,1.24E-02 +3475,1.46E-02,1.09E-02,1.11E-02 +3480,1.45E-02,1.12E-02,1.13E-02 +3485,1.45E-02,1.21E-02,1.22E-02 +3490,1.44E-02,1.04E-02,1.05E-02 +3495,1.43E-02,1.23E-02,1.24E-02 +3500,1.42E-02,1.19E-02,1.20E-02 +3505,1.42E-02,1.18E-02,1.19E-02 +3510,1.41E-02,1.20E-02,1.21E-02 +3515,1.40E-02,1.15E-02,1.16E-02 +3520,1.39E-02,1.21E-02,1.22E-02 +3525,1.39E-02,1.14E-02,1.15E-02 +3530,1.38E-02,1.11E-02,1.12E-02 +3535,1.38E-02,9.46E-03,9.53E-03 +3540,1.37E-02,9.03E-03,9.10E-03 +3545,1.37E-02,9.54E-03,9.62E-03 +3550,1.36E-02,1.05E-02,1.06E-02 +3555,1.35E-02,9.06E-03,9.12E-03 +3560,1.34E-02,1.08E-02,1.09E-02 +3565,1.34E-02,1.09E-02,1.09E-02 +3570,1.33E-02,8.34E-03,8.40E-03 +3575,1.32E-02,8.64E-03,8.70E-03 +3580,1.31E-02,1.02E-02,1.03E-02 +3585,1.31E-02,9.17E-03,9.23E-03 +3590,1.30E-02,9.45E-03,9.51E-03 +3595,1.29E-02,9.67E-03,9.73E-03 +3600,1.29E-02,1.03E-02,1.03E-02 +3605,1.28E-02,1.04E-02,1.04E-02 +3610,1.27E-02,9.48E-03,9.54E-03 +3615,1.27E-02,9.47E-03,9.53E-03 +3620,1.26E-02,1.16E-02,1.17E-02 +3625,1.26E-02,1.02E-02,1.03E-02 +3630,1.25E-02,9.96E-03,1.00E-02 +3635,1.25E-02,1.03E-02,1.04E-02 +3640,1.24E-02,1.15E-02,1.15E-02 +3645,1.24E-02,1.06E-02,1.07E-02 +3650,1.23E-02,1.01E-02,1.02E-02 +3655,1.22E-02,1.10E-02,1.10E-02 +3660,1.22E-02,1.09E-02,1.10E-02 +3665,1.22E-02,1.03E-02,1.03E-02 +3670,1.20E-02,7.90E-03,7.95E-03 +3675,1.20E-02,4.83E-03,4.86E-03 +3680,1.19E-02,8.33E-03,8.38E-03 +3685,1.18E-02,9.44E-03,9.49E-03 +3690,1.18E-02,9.69E-03,9.75E-03 +3695,1.17E-02,1.01E-02,1.02E-02 +3700,1.16E-02,1.09E-02,1.09E-02 +3705,1.16E-02,1.08E-02,1.08E-02 +3710,1.15E-02,9.36E-03,9.41E-03 +3715,1.15E-02,9.23E-03,9.27E-03 +3720,1.14E-02,1.04E-02,1.04E-02 +3725,1.14E-02,1.07E-02,1.08E-02 +3730,1.13E-02,9.27E-03,9.32E-03 +3735,1.13E-02,8.58E-03,8.63E-03 +3740,1.11E-02,8.85E-03,8.89E-03 +3745,1.11E-02,1.03E-02,1.04E-02 +3750,1.10E-02,9.29E-03,9.33E-03 +3755,1.10E-02,8.99E-03,9.03E-03 +3760,1.09E-02,8.86E-03,8.90E-03 +3765,1.09E-02,8.55E-03,8.59E-03 +3770,1.09E-02,9.12E-03,9.16E-03 +3775,1.08E-02,9.05E-03,9.09E-03 +3780,1.07E-02,9.57E-03,9.62E-03 +3785,1.07E-02,8.81E-03,8.85E-03 +3790,1.06E-02,7.76E-03,7.79E-03 +3795,1.06E-02,8.87E-03,8.91E-03 +3800,1.05E-02,9.86E-03,9.90E-03 +3805,1.05E-02,9.30E-03,9.34E-03 +3810,1.04E-02,8.25E-03,8.28E-03 +3815,1.04E-02,7.76E-03,7.79E-03 +3820,1.03E-02,9.66E-03,9.69E-03 +3825,1.03E-02,9.51E-03,9.54E-03 +3830,1.03E-02,9.59E-03,9.63E-03 +3835,1.02E-02,7.69E-03,7.72E-03 +3840,1.02E-02,8.98E-03,9.01E-03 +3845,1.01E-02,8.78E-03,8.81E-03 +3850,1.01E-02,8.83E-03,8.86E-03 +3855,1.00E-02,8.51E-03,8.54E-03 +3860,9.94E-03,7.99E-03,8.02E-03 +3865,9.91E-03,8.10E-03,8.12E-03 +3870,9.83E-03,7.36E-03,7.38E-03 +3875,9.83E-03,6.76E-03,6.78E-03 +3880,9.75E-03,6.53E-03,6.55E-03 +3885,9.70E-03,6.77E-03,6.79E-03 +3890,9.71E-03,6.88E-03,6.90E-03 +3895,9.62E-03,7.48E-03,7.50E-03 +3900,9.60E-03,7.93E-03,7.95E-03 +3905,9.59E-03,7.93E-03,7.95E-03 +3910,9.52E-03,7.14E-03,7.16E-03 +3915,9.50E-03,6.99E-03,7.01E-03 +3920,9.41E-03,6.95E-03,6.97E-03 +3925,9.40E-03,6.85E-03,6.87E-03 +3930,9.32E-03,7.05E-03,7.07E-03 +3935,9.30E-03,7.35E-03,7.37E-03 +3940,9.23E-03,7.40E-03,7.42E-03 +3945,9.20E-03,7.54E-03,7.56E-03 +3950,9.11E-03,7.63E-03,7.65E-03 +3955,9.08E-03,7.72E-03,7.74E-03 +3960,9.02E-03,7.75E-03,7.77E-03 +3965,9.01E-03,7.81E-03,7.83E-03 +3970,8.93E-03,7.68E-03,7.70E-03 +3975,8.91E-03,7.51E-03,7.53E-03 +3980,8.84E-03,7.39E-03,7.40E-03 +3985,8.80E-03,7.43E-03,7.45E-03 +3990,8.78E-03,7.37E-03,7.39E-03 +3995,8.70E-03,7.21E-03,7.23E-03 +4000,8.68E-03,7.10E-03,7.12E-03 \ No newline at end of file diff --git a/pvcircuit/iv3T.py b/pvcircuit/iv3T.py index feaeba7..407ad15 100644 --- a/pvcircuit/iv3T.py +++ b/pvcircuit/iv3T.py @@ -7,6 +7,7 @@ import copy import math # simple math import os +import re import matplotlib as mpl import matplotlib.pyplot as plt # plotting @@ -172,6 +173,11 @@ def __str__(self): elif i == prntmax: strout += "\n\n" + # Clean string from numpy types present after numpy > 2.x.x + strout = re.sub(r"np\.(?:int|float|int64|float64)\(([^)]+)\)", r"\1", strout) + # replace negative 0 + strout = re.sub(r'-0\.(0+)\b', r'0.\1 ', strout) + return strout def __repr__(self): @@ -446,7 +452,7 @@ def sort(self, key): # sort a iv3T line based on array key # unexpected results for iv3T box sortarray = getattr(self, key) - p = np.argsort(sortarray) + p = np.argsort(sortarray, kind="stable") for key in self.arraykeys: array = getattr(self, key) diff --git a/pvcircuit/qe.py b/pvcircuit/qe.py index 7e37c58..7f33198 100644 --- a/pvcircuit/qe.py +++ b/pvcircuit/qe.py @@ -1,28 +1,32 @@ # -*- coding: utf-8 -*- """ -This is the PVcircuit Package. +This is the PVcircuit Package. pvcircuit.qe # functions for QE analysis """ -import math #simple math import copy -from time import time +import math #simple math +import os from functools import lru_cache +from pathlib import Path +from time import time + +import ipywidgets as widgets +import matplotlib as mpl #plotting +import matplotlib.pyplot as plt #plotting +import numpy as np #arrays import pandas as pd #dataframes -import numpy as np #arrays + +#from scipy.integrate import trapezoid +import scipy.constants as con #physical constants from cycler import cycler -import matplotlib.pyplot as plt #plotting -import matplotlib as mpl #plotting -from scipy.optimize import brentq #root finder +from IPython.display import display + #from scipy.special import lambertw, gammaincc, gamma #special functions from scipy.interpolate import interp1d -#from scipy.integrate import trapezoid -import scipy.constants as con #physical constants -import ipywidgets as widgets -from IPython.display import display +from scipy.optimize import brentq #root finder + from pvcircuit.junction import * -from num2words import num2words -import os from pvcircuit.multi2T import * # colors @@ -45,11 +49,11 @@ # standard data -pvcpath = os.path.dirname(os.path.dirname(__file__)) -datapath = os.path.join(pvcpath, 'data','') # Data files here +pvcpath = Path(__file__).parent +datapath = pvcpath.joinpath('data') # Data files here #datapath = os.path.abspath(os.path.relpath('../data/', start=__file__)) #datapath = pvcpath.replace('/pvcircuit','/data/') -ASTMfile = os.path.join(datapath,'ASTMG173.csv') +ASTMfile = datapath.joinpath('ASTMG173.csv') try: dfrefspec = pd.read_csv(ASTMfile, index_col=0, header=2) wvl=dfrefspec.index.to_numpy(dtype=np.float64, copy=True) @@ -63,9 +67,18 @@ print(datapath) print(ASTMfile) + +def ordinal(n): + suffixes = {1: 'st', 2: 'nd', 3: 'rd'} + if 10 <= n % 100 <= 20: + suffix = 'th' + else: + suffix = suffixes.get(n % 10, 'th') + return f"{n}{suffix}" + def JdbMD(EQE, xEQE, TC, Eguess = 1.0, kTfilter=3, bplot=False): ''' - calculate detailed-balance reverse saturation current + calculate detailed-balance reverse saturation current from EQE vs xEQE xEQE in nm, can optionally use (start, step) for equally spaced data debug on bplot @@ -74,14 +87,14 @@ def JdbMD(EQE, xEQE, TC, Eguess = 1.0, kTfilter=3, bplot=False): EQE = np.array(EQE) #ensure numpy if EQE.ndim == 1: #1D EQE[lambda] nQlams, = EQE.shape - njuncs = 1 + njuncs = 1 elif EQE.ndim == 2: #2D EQE[lambda, junction] nQlams, njuncs = EQE.shape else: return 'dims in EQE:' + str(EQE.ndim) Eguess = np.array([Eguess] * njuncs) - + if len(xEQE) == 2: # evenly spaced x-values (start, stop) start, stop = xEQE #stop = start + step * (nQlams - 1) @@ -101,39 +114,39 @@ def JdbMD(EQE, xEQE, TC, Eguess = 1.0, kTfilter=3, bplot=False): Egvect = np.vectorize(EgFromJdb) EkT = nm2eV / Vthlocal / xEQE blackbody = np.expand_dims(DBWVL_PREFIX / (xEQE*1e-9)**4 / np.expm1(EkT) , axis=1) - - for count in range(10): + + for count in range(10): nmfilter = nm2eV/(Eguess - Vthlocal * kTfilter) #MD [652., 930.] if njuncs == 1: EQEfilter = np.expand_dims(EQE.copy(), axis=1) else: EQEfilter = EQE.copy() - + for i, lam in enumerate(xEQE): - EQEfilter[i,:] *= (lam < nmfilter) #zero EQE about nmfilter - - DBintegral = blackbody * EQEfilter - Jdb = np.trapz(DBintegral, x=(xEQE*1e-9), axis=0) + EQEfilter[i,:] *= (lam < nmfilter) #zero EQE about nmfilter + + DBintegral = blackbody * EQEfilter + Jdb = np.trapz(DBintegral, x=(xEQE*1e-9), axis=0) Egnew = Egvect(TC, Jdb) if bplot: print(Egnew, max((Egnew-Eguess)/Egnew)) if np.amax((Egnew-Eguess)/Egnew) < 1e-6: break - else: + else: Eguess=Egnew - + if bplot: efig, eax = plt.subplots() eax.plot(xEQE, DBintegral[:,0], c='blue', lw=2, marker='.') if njuncs > 1: reax = eax.twinx() #right axis - reax.plot(xEQE, DBintegral[:,1], c='red', lw=2, marker='.') + reax.plot(xEQE, DBintegral[:,1], c='red', lw=2, marker='.') return Jdb, Egnew def PintMD(Pspec, xspec=wvl): #optical power of spectrum over full range return JintMD(None, None, Pspec, xspec) - + def JintMD(EQE, xEQE, Pspec, xspec=wvl): ''' integrate over spectrum or spectra @@ -143,17 +156,17 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): Jsc = int(Pspec*QE[0]*lambda) in [mA/cm2] EQE optionally scalar for constant over xEQE range integrate over full spectrum is xEQE is None - + integrate multidimentional EQE(lambda)(junction) times MD reference spectra Pspec(lambda)(ispec) - external quantum efficiency EQE[unitless] x-units = nm, + external quantum efficiency EQE[unitless] x-units = nm, reference spectra Pspec[W/m2/nm] x-units = nm optionally Pspec as string 'space', 'global', 'direct' or '' for all three - xEQE in nm, can optionally + xEQE in nm, can optionally use (start, step) for equally spaced data use None for same as xspec default x values for Pspec from wvl ''' - + #check spectra input if type(Pspec) is str: # optional string space, global, direct if Pspec in dfrefspec.columns: @@ -170,11 +183,11 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): nSlams, nspecs = Pspec.shape else: return 'dims in Pspec:' + str(Pspec.ndim) - + #check EQE input EQE = np.array(EQE) #ensure numpy if EQE.ndim == 0: #scalar or None - if np.any(EQE): + if np.any(EQE): nQlams=1 #scalar -> return current njuncs=1 else: @@ -187,23 +200,23 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): nQlams, njuncs = EQE.shape else: return 'dims in EQE:' + str(EQE.ndim) - + #check x range input xEQE = np.array(xEQE, dtype=np.float64) if xEQE.ndim == 0: #scalar or None xEQE = xspec #use spec range if no EQE range if xEQE.ndim == 1: #1D - nxEQE, = xEQE.shape + nxEQE, = xEQE.shape start = min(xEQE) - stop = max(xEQE) + stop = max(xEQE) if nxEQE == 2: # evenly spaced x-values (start, stop) xEQE= np.linspace(start, stop, max(nQlams,2), dtype=np.float64) else: return 'dims in xEQE:' + str(xEQE.ndim) - + if nQlams == 1: EQE = np.full_like(xEQE,EQE) - + if xspec.ndim != 1: # need 1D with same length as Pspec(lam) return 'dims in xspec:' + str(xspec.ndim) + '!=1' elif len(xspec) != nSlams: @@ -215,14 +228,14 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): pass elif len(xEQE) != nQlams: return 'nQlams:' + str(len(xEQE)) + '!='+ str(nQlams) - + #find start and stop index of nSlams n0=0 n1=nSlams-1 for i, lam in enumerate(xspec): if lam <= min(start,stop): n0 = i - elif lam <= max(start,stop): + elif lam <= max(start,stop): n1 = i else: break @@ -233,7 +246,7 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): Jintegral = Pspec.copy()[n0:n1+1] #for Ptot else: Jintegral = Pspec.copy()[n0:n1+1,:] #for Ptot - + else: #calculate J over xrange #print(xrange.shape, xEQE.shape, EQE.shape, Pspec.shape) EQEinterp = interp1d(xEQE, EQE, axis=0, fill_value=0) # interpolate along axis=0 @@ -249,9 +262,9 @@ def JintMD(EQE, xEQE, Pspec, xspec=wvl): Jintegral[:,:,ijunc] = Pspec.copy()[n0:n1+1,:] #for Ptot Jintegral[:,:,ijunc] *= EQEfine[:, np.newaxis, ijunc] - Jint = np.trapz(Jintegral, x=xrange, axis=0) + Jint = np.trapz(Jintegral, x=xrange, axis=0) #print(xrange.shape, EQEfine.shape, EQE.shape, Pspec.shape, Jintegral.shape) - #print(nSlams, nspecs, njuncs, nQlams, start, stop, xspec[n0], xspec[n1], n0, n1) + #print(nSlams, nspecs, njuncs, nQlams, start, stop, xspec[n0], xspec[n1], n0, n1) return Jint @lru_cache(maxsize = 100) @@ -262,7 +275,7 @@ def JdbFromEg(TC,Eg,dbsides=1.,method=None): Eg[=]eV TK[=]K returns Jdb[=]A/cm2 - + optional parameters method: 'gamma' dbsides: single-sided->1. bifacial->2. @@ -275,7 +288,7 @@ def JdbFromEg(TC,Eg,dbsides=1.,method=None): if str(method).lower=='gamma': #use special function incomplete gamma #gamma(3)=2.0 not same incomplete gamma as in Igor - Jdb = DB_PREFIX * TKlocal**3. * gammaincc(3., EgkT) * 2.0 * dbsides + Jdb = DB_PREFIX * TKlocal**3. * gammaincc(3., EgkT) * 2.0 * dbsides else: #Jdb as in Geisz et al. Jdb = DB_PREFIX * TKlocal**3. * (EgkT*EgkT + 2.*EgkT + 2.) * np.exp(-EgkT) * dbsides #units from DB_PREFIX @@ -289,8 +302,8 @@ def EgFromJdb(TC, Jdb, Eg=1.0, eps=1e-6, itermax=100, dbsides=1.): return the bandgap from the Jdb assuming a square EQE iterates using gammaInc(3,x)=2*exp(-x)*(1+x+x^2/2) - see special functions, Andrews p.73 - + see special functions, Andrews p.73 + optional parameters Eg=1.0 eV #initial guess eps=0.001 #tolerance @@ -321,7 +334,7 @@ class EQE(object): EQE object It creates a class containing nth junctions EQEs and Luminescent Coupling between junctions. The contribution can be studied interectively using - ipywidgets under a notebook. + ipywidgets under a notebook. The methods self.control create the self.ui to adjust the LC self.plot function to plot @@ -333,7 +346,7 @@ def __init__(self, rawEQE, xEQE, name='EQE', sjuncs=None): rawEQE (numpy.array): 2D(lambda)(junction) raw input rawEQE (not LC corrected) xEQE(numpy.array) xEQE # wavelengths [nm] for rawEQE data name (str): name of EQE object, sample - sjuncs [list of str]: labels for the junctions, if None it is self generated + sjuncs [list of str]: labels for the junctions, if None it is self generated The number of junctions is created from the dimension of the EQE self.njuncs = njuncs # number of junctions @@ -341,7 +354,7 @@ def __init__(self, rawEQE, xEQE, name='EQE', sjuncs=None): #check EQE input rawEQE = np.array(rawEQE) #ensure numpy if rawEQE.ndim == 0: #scalar or None - if np.any(rawEQE): + if np.any(rawEQE): nQlams=1 #scalar -> return current njuncs=1 else: @@ -355,15 +368,15 @@ def __init__(self, rawEQE, xEQE, name='EQE', sjuncs=None): nQlams, njuncs = rawEQE.shape else: return 'dims in rawEQE:' + str(rawEQE.ndim) - + #check x range input xEQE = np.array(xEQE, dtype=np.float64) if xEQE.ndim == 0: #scalar or None xEQE = xspec #use spec range if no rawEQE range if xEQE.ndim == 1: #1D - nxEQE, = xEQE.shape + nxEQE, = xEQE.shape self.start = min(xEQE) - self.stop = max(xEQE) + self.stop = max(xEQE) if nxEQE == 2: # evenly spaced x-values (start, stop) xEQE= np.linspace(self.start, self.stop, max(nQlams,2), dtype=np.float64) else: @@ -380,11 +393,11 @@ def __init__(self, rawEQE, xEQE, name='EQE', sjuncs=None): return 'nQlams:' + str(len(xEQE)) + '!='+ str(nQlams) if sjuncs == None: - sjuncs = [num2words(junc+1, to = 'ordinal') for junc in range(njuncs)] + sjuncs = [ordinal(junc+1) for junc in range(njuncs)] #class attributes - - self.ui = None + + self.ui = None self.debugout = widgets.Output() # debug output self.name = name # name of EQE object self.rawEQE = rawEQE # 2D(lambda)(junction) raw input rawEQE (not LC corrected) @@ -392,16 +405,16 @@ def __init__(self, rawEQE, xEQE, name='EQE', sjuncs=None): self.njuncs = njuncs # number of junctions self.sjuncs = sjuncs # names of junctions self.nQlams = nQlams # number of wavelengths in rawEQE data - - self.corrEQE = np.empty_like(self.rawEQE) # luminescent coupling corrected EQE same size as rawEQE + + self.corrEQE = np.empty_like(self.rawEQE) # luminescent coupling corrected EQE same size as rawEQE self.etas = np.zeros((njuncs,3), dtype=np.float64) #LC factor for next three junctions self.LCcorr() #calculate LC with zero etas - + def LCcorr(self, junc=None, dist=None, val=None): - """It applies the correction of the Luminescent + """It applies the correction of the Luminescent coupling to the QE junc [l - using procedure from + using procedure from Steiner et al., IEEE PV, v3, p879 (2013) """ # change one eta[junc,dist] value @@ -421,7 +434,7 @@ def LCcorr(self, junc=None, dist=None, val=None): elif ijunc == 1: #2nd ijunction denom=1.+etas[ijunc,0] self.corrEQE[:,ijunc] = raw[:,ijunc] * denom \ - - raw[:,ijunc-1] * etas[ijunc,0] + - raw[:,ijunc-1] * etas[ijunc,0] elif ijunc == 2: #3rd ijunction denom=1.+etas[ijunc,0]*(1.+etas[ijunc,1]) self.corrEQE[:,ijunc] = raw[:,ijunc] * denom \ @@ -433,36 +446,36 @@ def LCcorr(self, junc=None, dist=None, val=None): - raw[:,ijunc-1] * etas[ijunc,0] \ - raw[:,ijunc-2] * etas[ijunc,0] * etas[ijunc,1] \ - raw[:,ijunc-3] * etas[ijunc,0] * etas[ijunc,1] * etas[ijunc,2] - + def Jdb(self, TC, Eguess = 1.0, kTfilter=3, dbug=False): """It calculate Jscs and Egs from self.corrEQE""" - Vthlocal = Vth(TC) #kT + Vthlocal = Vth(TC) #kT Eguess = np.array([Eguess] * self.njuncs) Egvect = np.vectorize(EgFromJdb) EkT = nm2eV / Vthlocal / self.xEQE blackbody = np.expand_dims(DBWVL_PREFIX / (self.xEQE*1e-9)**4 / np.expm1(EkT) , axis=1) - - for count in range(10): + + for count in range(10): nmfilter = nm2eV/(Eguess - Vthlocal * kTfilter) #MD [652., 930.] EQEfilter = self.corrEQE.copy() - + for i, lam in enumerate(self.xEQE): - EQEfilter[i,:] *= (lam < nmfilter) #zero EQE about nmfilter - - DBintegral = blackbody * EQEfilter - Jdb = np.trapz(DBintegral, x=(self.xEQE*1e-9), axis=0) + EQEfilter[i,:] *= (lam < nmfilter) #zero EQE about nmfilter + + DBintegral = blackbody * EQEfilter + Jdb = np.trapz(DBintegral, x=(self.xEQE*1e-9), axis=0) Egnew = Egvect(TC, Jdb) if dbug: print(Egnew, max((Egnew-Eguess)/Egnew)) if np.amax((Egnew-Eguess)/Egnew) < 1e-6: break - else: + else: Eguess=Egnew self.Egs = Egnew return Jdb, Egnew def Jint(self, Pspec='global', xspec=wvl): - """It integrates over spectrum or spectra + """It integrates over spectrum or spectra J = spectra * lambda * EQE(lambda) Jsc = int(Pspec*QE[0]*lambda) in [mA/cm2] EQE optionally scalar for constant over xEQE range @@ -498,13 +511,13 @@ def Jint(self, Pspec='global', xspec=wvl): for i, lam in enumerate(xspec): if lam <= min(self.start,self.stop): n0 = i - elif lam <= max(self.start,self.stop): + elif lam <= max(self.start,self.stop): n1 = i else: break xrange = xspec[n0:n1+1] # range of xspec values within xEQE range nrange = abs(n1+1-n0) - + #remember these for now self.Pspec = Pspec # 2D(lambda)(spectrum) spectral irradiance [W/m2/nm] self.xspec = xspec # wavelengths [nm] for spectra @@ -518,19 +531,19 @@ def Jint(self, Pspec='global', xspec=wvl): EQEfine = EQEinterp(xrange) * xrange[:,np.newaxis] * JCONST # lambda*EQE(lambda)[lambda,junc] for ijunc in range(self.njuncs): Jintegral[:,:,ijunc] = Pspec[n0:n1+1,:] * EQEfine[:, np.newaxis, ijunc] - return np.trapz(Jintegral, x=xrange, axis=0) - + return np.trapz(Jintegral, x=xrange, axis=0) + def plot(self, Pspec='global', ispec=0, specname=None, xspec=wvl, size='x-large'): # plot EQE on top of a spectrum rnd2 =100 - + fig, ax = plt.subplots() ax.set_prop_cycle(color=Multi2T.junctioncolors[self.njuncs]) for i in range(self.njuncs): rlns = ax.plot(self.xEQE, self.rawEQE[:,i], lw=1, ls='--', marker='', label='_'+self.sjuncs[i]) ax.plot(self.xEQE, self.corrEQE[:,i], lw=3, c=rlns[0].get_color(), marker='', label=self.sjuncs[i]) ax.legend() - ax.set_ylim(-0.1,1.1) + ax.set_ylim(-0.1,1.1) ax.set_xlim(math.floor(self.start/rnd2)*rnd2, math.ceil(self.stop/rnd2)*rnd2) ax.set_ylabel('EQE', size=size) # Add a y-label to the axes. ax.set_xlabel('Wavelength (nm)', size=size) # Add an x-label to the axes. @@ -549,7 +562,7 @@ def plot(self, Pspec='global', ispec=0, specname=None, xspec=wvl, size='x-large' Pspec = dfrefspec.to_numpy(dtype=np.float64, copy=True) #just use refspec instead of error if np.any(Pspec): - Pspec = np.array(Pspec, dtype=np.float64) + Pspec = np.array(Pspec, dtype=np.float64) if not specname: specname='spectrum'+str(ispec) if Pspec.ndim == 2: Pspec = Pspec[:,ispec] #slice 2D numpy to 1D rax.fill_between(xspec, Pspec, step="mid", alpha=0.2, color='grey', label='fill') @@ -558,7 +571,7 @@ def plot(self, Pspec='global', ispec=0, specname=None, xspec=wvl, size='x-large' rax.set_ylim(0,2) #rax.legend(loc=7) return ax, rax - + def controls(self, Pspec='global', ispec=0, specname=None, xspec=wvl): ''' use interactive_output for GUI in IPython @@ -568,11 +581,11 @@ def controls(self, Pspec='global', ispec=0, specname=None, xspec=wvl): junc_layout = widgets.Layout(display='flex', flex_flow='row', justify_content='space-around') - multi_layout = widgets.Layout(display='flex', + multi_layout = widgets.Layout(display='flex', flex_flow='row', justify_content='space-around') - replot_types = [widgets.widgets.widget_float.BoundedFloatText, + replot_types = [widgets.widgets.widget_float.BoundedFloatText, widgets.widgets.widget_int.BoundedIntText, widgets.widgets.widget_int.IntSlider, widgets.widgets.widget_float.FloatSlider, @@ -584,7 +597,7 @@ def on_EQEchange(change): new = change['new'] #new value owner = change['owner'] #control value = owner.value - desc = owner.description + desc = owner.description #with self.debugout: print('Mcontrol: ' + desc + '->', value) #self.set(**{desc:value}) @@ -594,13 +607,13 @@ def on_EQEreplot(change): if type(change) is widgets.widgets.widget_button.Button: owner = change else: # other controls - owner = change['owner'] #control - value = owner.value - desc = owner.description + owner = change['owner'] #control + value = owner.value + desc = owner.description if desc == 'Recalc': fast = False - - #recalculate - ts = time() + + #recalculate + ts = time() if desc[:3] == 'eta': junc, dist = parse('eta{:1d}{:1d}',desc) self.LCcorr(junc, dist, value) #replace one value and recalculate LC @@ -608,7 +621,7 @@ def on_EQEreplot(change): elif desc == 'spec': if value in dfrefspec.columns: specname = value - Pspec = dfrefspec[specname].to_numpy(dtype=np.float64, copy=True) + Pspec = dfrefspec[specname].to_numpy(dtype=np.float64, copy=True) else: VoutBox.clear_output() with VoutBox: print(desc) @@ -623,7 +636,7 @@ def on_EQEreplot(change): for i in range(self.njuncs): if linelabel == self.sjuncs[i]: line.set_data(self.xEQE, self.corrEQE[:,i]) #replot - + rlines = rax.get_lines() for line in rlines: linelabel=line.get_label() @@ -633,7 +646,7 @@ def on_EQEreplot(change): specname = linelabel Pspec = specname else: - line.set_data(xspec, Pspec) #replot spectrum + line.set_data(xspec, Pspec) #replot spectrum for obj in rax.get_children(): if type(obj) is mpl.collections.PolyCollection: #contours if obj.get_label() == 'fill': @@ -646,8 +659,8 @@ def on_EQEreplot(change): OP = PintMD(Pspec, xspec) VoutBox.clear_output() - with VoutBox: - stext = (specname+' {0:6.2f} W/m2').format(OP) + with VoutBox: + stext = (specname+' {0:6.2f} W/m2').format(OP) print('Eg = ',Egs, ' eV') print(stext) print('Jsc = ',Jscs[0], ' mA/cm2') @@ -660,11 +673,11 @@ def on_EQEreplot(change): VoutBox = widgets.Output() VoutBox.layout.height = '70px' #with VoutBox: print('Summary') - + # Right output -> EQE plot Rout = widgets.Output() with Rout: # output device - if plt.isinteractive: + if plt.isinteractive: plt.ioff() restart = True else: @@ -678,15 +691,15 @@ def on_EQEreplot(change): if linelabel in refnames: specname = linelabel if restart: plt.ion() - + # tandem3T controls in_tit = widgets.Label(value='EQE: ', description='title') in_name = widgets.Text(value=self.name, description='name', layout=tand_layout, - continuous_update=False) + continuous_update=False) in_name.observe(on_EQEchange,names='value') #update values - + in_spec = widgets.Dropdown(value=specname, description='spec', layout=tand_layout, - options=refnames) + options=refnames) in_spec.observe(on_EQEreplot,names='value') #update values Hui = widgets.HBox([in_tit, in_name, in_spec]) @@ -697,14 +710,14 @@ def on_EQEreplot(change): elist1 = [] elist2 = [] # list of eta controls - for i in range(self.njuncs) : - if i > 0: + for i in range(self.njuncs) : + if i > 0: in_eta.append(widgets.FloatSlider(value=self.etas[i,0], min=-0.2, max=1.5,step=0.001, description='eta'+str(i)+"0",layout=junc_layout,readout_format='.4f')) j = len(in_eta)-1 elist0.append(in_eta[j]) in_eta[j].observe(on_EQEreplot,names='value') #replot - #if i > 1: + #if i > 1: in_eta.append(widgets.FloatSlider(value=self.etas[i,1], min=-0.2, max=1.5,step=0.001, description='eta'+str(i)+"1",layout=junc_layout,readout_format='.4f')) j = len(in_eta)-1 @@ -713,8 +726,8 @@ def on_EQEreplot(change): if i > 1: in_eta[j].observe(on_EQEreplot,names='value') #replot else: - in_eta[j].disabled = True - #if i > 2: + in_eta[j].disabled = True + #if i > 2: in_eta.append(widgets.FloatSlider(value=self.etas[i,2], min=-0.2, max=1.5,step=0.001, description='eta'+str(i)+"2",layout=junc_layout,readout_format='.4f')) j = len(in_eta)-1 @@ -722,21 +735,21 @@ def on_EQEreplot(change): if i > 2: in_eta[j].observe(on_EQEreplot,names='value') #replot else: - in_eta[j].disabled = True + in_eta[j].disabled = True etaui0 = widgets.HBox(elist0) etaui1 = widgets.HBox(elist1) etaui2 = widgets.HBox(elist2) - + #in_Rs2T.observe(on_2Treplot,names='value') #replot - #in_2Tbut.on_click(on_2Treplot) #replot - + #in_2Tbut.on_click(on_2Treplot) #replot + #EQE_ui = widgets.HBox(clist) - #eta_ui = widgets.HBox(jui) - + #eta_ui = widgets.HBox(jui) + ui = widgets.VBox([Rout, VoutBox, Hui, etaui0, etaui1, etaui2]) self.ui = ui #in_2Tbut.click() #fill in MPP values # return entire user interface, dark and light graph axes for tweaking return ui, ax, rax - + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..40eaa2b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,225 @@ +# Guide (user-friendly): +# https://packaging.python.org/en/latest/guides/writing-pyproject-toml/ + +# Specification (technical, formal): +# https://packaging.python.org/en/latest/specifications/pyproject-toml/ + + +# Choosing a build backend: +# https://packaging.python.org/en/latest/tutorials/packaging-projects/#choosing-a-build-backend +[build-system] +# A list of packages that are needed to build your package: +requires = ["setuptools", "wheel"] # REQUIRED if [build-system] table is used +# The name of the Python object that frontends will use to perform the build: +build-backend = "setuptools.build_meta" # If not defined, then legacy behavior can happen. + + +[project] +# This is the name of your project. The first time you publish this +# package, this name will be registered for you. It will determine how +# users can install this project, e.g.: +# +# $ pip install sampleproject +# +# And where it will live on PyPI: https://pypi.org/project/sampleproject/ +# +# There are some restrictions on what makes a valid project name +# specification here: +# https://packaging.python.org/specifications/core-metadata/#name +name = "pvcircuit" # REQUIRED, is the only field that cannot be marked as dynamic. + +# Versions should comply with PEP 440: +# https://www.python.org/dev/peps/pep-0440/ +# +# For a discussion on single-sourcing the version, see +# https://packaging.python.org/guides/single-sourcing-package-version/ +version = "0.0.5" # REQUIRED, although can be dynamic + +# This is a one-line description or tagline of what your project does. This +# corresponds to the "Summary" metadata field: +# https://packaging.python.org/specifications/core-metadata/#summary +description = "Multijunction PV circuit model" + +# This is an optional longer description of your project that represents +# the body of text which users will see when they visit PyPI. +# +# Often, this is the same as your README, so you can just read it in from +# that file directly. +# +# This field corresponds to the "Description" metadata field: +# https://packaging.python.org/specifications/core-metadata/#description-optional +readme = "README.md" + +# Specify which Python versions you support. In contrast to the +# 'Programming Language' classifiers in this file, 'pip install' will check this +# and refuse to install the project if the version does not match. See +# https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires +requires-python = ">=3.9" + +# This is either text indicating the license for the distribution, or a file +# that contains the license. +# https://packaging.python.org/en/latest/specifications/core-metadata/#license +license = {file = "LICENSE.txt"} + +# This field adds keywords for your project which will appear on the +# project page. What does your project relate to? +# +# Note that this is a list of additional keywords, separated +# by commas, to be used to assist searching for the distribution in a +# larger catalog. +keywords = ["PV modeling", "Tandem solar cells"] + +# This should be your name or the name of the organization who originally +# authored the project, and a valid email address corresponding to the name +# listed. +authors = [ + {name = "John Geisz", email = "john.geiz@nrel.gov" } +] + +# This should be your name or the names of the organization who currently +# maintains the project, and a valid email address corresponding to the name +# listed. +maintainers = [ + {name = "John Geisz", email = "john.geiz@nrel.gov" }, + {name = "Robert Witteck", email = "robert.witteck@nrel.gov" } +] + +# Classifiers help users find your project by categorizing it. +# +# For a list of valid classifiers, see https://pypi.org/classifiers/ +classifiers = [ + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + "Development Status :: 4 - Beta", + + # Indicate who your project is intended for + "Intended Audience :: PV-research", + "Topic :: PV modeling :: PV simulation", + + # Pick your license as you wish + "License :: OSI Approved :: BSD License", + + # Specify the Python versions you support here. In particular, ensure + # that you indicate you support Python 3. These classifiers are *not* + # checked by "pip install". See instead "requires-python" key in this file. + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3 :: Only", +] + +# This field lists other packages that your project depends on to run. +# Any package you put here will be installed by pip when your project is +# installed, so they must be valid existing projects. +# +# For an analysis of this field vs pip's requirements files see: +# https://packaging.python.org/discussions/install-requires-vs-requirements/ +dependencies = [ + "matplotlib", + "numpy", + "pandas", + "scipy", + "ipywidgets", + "ipympl", + "jupyter", + "parse", + "pvlib", + + "dask", + "tqdm", +] + +# List additional groups of dependencies here (e.g. development +# dependencies). Users will be able to install these using the "extras" +# syntax, for example: +# +# $ pip install sampleproject[dev] +# +# Optional dependencies the project provides. These are commonly +# referred to as "extras". For a more extensive definition see: +# https://packaging.python.org/en/latest/specifications/dependency-specifiers/#extras +[project.optional-dependencies] +dev = [ + "black", + "check-manifest", + "coverage", + "pytest", + "pytest-cov", + "ruff", + ] +test = [ + "check-manifest", + "coverage", + "pytest", + "pytest-cov", + ] + +# List URLs that are relevant to your project +# +# This field corresponds to the "Project-URL" and "Home-Page" metadata fields: +# https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use +# https://packaging.python.org/specifications/core-metadata/#home-page-optional +# +# Examples listed include a pattern for specifying where the package tracks +# issues, where the source is hosted, where to say thanks to the package +# maintainers, and where to support the project financially. The key is +# what's used to render the link text on PyPI. +[project.urls] +"Homepage" = "https://github.com/NREL/PVcircuit" +"Bug Reports" = "https://github.com/NREL/PVcircuit/issues" + +# This is configuration specific to the `setuptools` build backend. +# If you are using a different build backend, you will need to change this. +# [tool.setuptools] +# If there are data files included in your packages that need to be +# installed, specify them here. +# package-data = {"sample" = ["*.dat"]} +# packages = ["pvcircuit"] # Adjust based on your actual package structure +# package-data = {"pvcircuit" = ["data/*"]} +# include-package-data = true +# [options.package_data] +# pvcircuit ="data/*" + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +include = ["pvcircuit*"] + +[tool.setuptools.package-data] +pvcircuit = ["data/*"] + +[tool.ruff] +# select = ["E", "W", "F"] # Select categories of linting rules +ignore = [ + "F401", # Ignore unused imports + # "F841", # Ignore unused variables +] + +[tool.pytest.ini_options] +# Specify directories to ignore during testing +norecursedirs = ["Share", "notebooks", "images", "data"] +addopts = "--cov=pvcircuit --cov-report=html --cov-report=term" # run coverage automatically with pytest + +[tool.coverage.run] +branch = true +source = ["pvcircuit"] +omit = [ + "tests/*", + "Share/*", + "notebooks/*", + "images/*", + "data/*", + "pvcircuit/PlotWithControls.py", +] + +[tool.coverage.report] +show_missing = true # shows lines without coverage + +[tool.coverage.html] +directory = "htmlcov" # HTML output directory +title = "PVcircuit coverage report" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index ca1df30..0000000 --- a/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -numpy>=1.13.3 -matplotlib>=2.1.0 -parse>=1.19.0 -scipy>=1.0.0 -ipywidgets>=7.6.5 -ipympl>=0.7.0 -pandas>=1.0 -num2words>=0.5.10 -tandems>=0.989 diff --git a/setup.py b/setup.py deleted file mode 100755 index a7dff2d..0000000 --- a/setup.py +++ /dev/null @@ -1,23 +0,0 @@ -from setuptools import setup, find_packages - -# Setting up -setup( - name="PVcircuit", - version='0.0.4', - author="John Geisz", - author_email="", - description='Multijunction PV circuit model', - long_description='Optoelectronic model of tandem and multijunction solar cells', - url='https://github.com/NREL/PVcircuit', - license='LICENSE.txt', - packages=find_packages(), - install_requires=['numpy>=1.13.3', - 'matplotlib>=2.1.0', - 'parse>=1.19.0', - 'scipy>=1.0.0', - 'ipywidgets>=7.6.5', - 'ipympl>=0.7.0', - 'pandas>=1.0', - 'num2words>=0.5.10', - 'tandems>=0.989'], -) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_4JIMM.py b/tests/test_4JIMM.py deleted file mode 100644 index fed8c96..0000000 --- a/tests/test_4JIMM.py +++ /dev/null @@ -1,44 +0,0 @@ -# # 4J IMM solar cell (MM927) from: -# ### J. F. Geisz, et al., IEEE Journal of Photovoltaics __5__, 1827 (2015). -import pandas as pd -import numpy as np -import pvcircuit as pvc -# import ipywidgets as widgets - -# %% -totalarea=1.15 -MM927 = pvc.Multi2T(name='MM927',Eg_list = [1.83,1.404,1.049,0.743], Jext=.012, Rser=0.1,area=1) -MM927.j[0].update(Jext=0.01196,n=[1,1.6],J0ratio=[31,4.5],totalarea=totalarea) -MM927.j[1].update(Jext=0.01149,n=[1,1.8],J0ratio=[17,42],beta=14.3,totalarea=totalarea) -MM927.j[2].update(Jext=0.01135,n=[1,1.4],J0ratio=[51,14],beta=8.6,totalarea=totalarea) -MM927.j[3].update(Jext=0.01228,n=[1,1.5],J0ratio=[173,79],beta=10.5,totalarea=totalarea) -MM927.j[3].RBB_dict={'method':'JFG', 'mrb':43., 'J0rb':0.3, 'Vrb':0.} - -# %% -plotit = False -if plotit: - import matplotlib.pyplot as plt - dfig, lfig, dax, lax, Vlight, Ilight = MM927.plot() - plt.show() -# %% - -info = MM927.MPP() - -print(info) - -# {'Voc': 3.425330977574876, - # 'Isc': 0.011350991117526023, - # 'Vmp': 3.0129358068534247, - # 'Imp': 0.011073118854968986, - # 'Pmp': 0.033362596291679855, - # 'FF': 0.8580715725119747} - -assert np.isclose(info['Voc'] , 3.425330977574876, rtol=1e-5) - -assert np.isclose(info['Isc'] , 0.011350991117526023, rtol=1e-5) - -assert np.isclose(info['Vmp'], 3.0129358068534247, rtol=1e-5) - -assert np.isclose(info['Imp'], 0.011073118854968986, rtol=1e-5) - -# %% diff --git a/tests/test_files/IBC2x2.csv b/tests/test_files/IBC2x2.csv new file mode 100644 index 0000000..1e6b6a2 --- /dev/null +++ b/tests/test_files/IBC2x2.csv @@ -0,0 +1,152 @@ +darkV,darkJ,lightV,lightJ +1,90.93,1,80.839996 +0.99,88.347504,0.99,78.775002 +0.98,85.717499,0.98,76.504997 +0.97,83.099998,0.97,74.1325 +0.96,80.485001,0.96,71.714996 +0.95,77.837494,0.95,69.275002 +0.94,75.212502,0.94,66.847504 +0.93,72.567497,0.93,64.3825 +0.92,69.949997,0.92,61.935001 +0.91,67.307503,0.91,59.462498 +0.9,64.695,0.9,57.005001 +0.89,62.087498,0.89,54.532501 +0.88,59.465,0.88,52.040001 +0.87,56.875,0.87,49.559998 +0.86,54.267498,0.86,47.060001 +0.85,51.697498,0.85,44.57 +0.84,49.122501,0.84,42.059998 +0.83,46.587502,0.83,39.572498 +0.82,44.067497,0.82,37.080002 +0.81,41.552498,0.81,34.567501 +0.8,39.0825,0.8,32.075001 +0.79,36.6175,0.79,29.565001 +0.78,34.212502,0.78,27.082499 +0.77,31.842501,0.77,24.602501 +0.76,29.495001,0.76,22.137751 +0.75,27.219999,0.75,19.67375 +0.74,24.970001,0.74,17.19475 +0.73,22.810001,0.73,14.749749 +0.72,20.717251,0.72,12.29575 +0.71,18.69475,0.71,9.8772497 +0.7,16.758001,0.7,7.4804997 +0.69,14.897249,0.69,5.0815001 +0.68,13.155001,0.68,2.727 +0.67,11.509001,0.67,0.35627499 +0.66,9.9997501,0.66,-1.76165 +0.65,8.6049995,0.65,-4.2030001 +0.64,7.3587499,0.64,-6.4327497 +0.63,6.2487497,0.63,-8.6239996 +0.62,5.2677498,0.62,-10.79275 +0.61,4.4317503,0.61,-12.8985 +0.6,3.7177501,0.6,-14.97025 +0.59,3.1275001,0.59,-16.963501 +0.58,2.6375,0.58,-18.91325 +0.57,2.2433748,0.57,-20.7735 +0.56,1.925375,0.56,-22.558001 +0.55,1.6687,0.55,-24.278 +0.54,1.46595,0.54,-27.5525 +0.53,1.302675,0.53,-29.0525 +0.52,1.174125,0.52,-30.415001 +0.51,1.071125,0.51,-31.645 +0.5,0.987625,0.5,-32.75 +0.49,0.92032498,0.49,-33.720001 +0.48,0.864425,0.48,-34.555 +0.47,0.81809998,0.47,-35.27 +0.46,0.77827501,0.46,-35.849998 +0.45,0.74397498,0.45,-36.334999 +0.44,0.71350002,0.44,-36.7075 +0.43,0.68594998,0.43,-37.025002 +0.42,0.66110003,0.42,-37.259998 +0.41,0.63782501,0.41,-37.427502 +0.4,0.61614996,0.4,-37.549999 +0.39,0.59547502,0.39,-37.630001 +0.38,0.57602501,0.38,-37.702499 +0.37,0.55720001,0.37,-37.77 +0.36,0.53887498,0.36,-37.8475 +0.35,0.52112496,0.35,-37.9175 +0.34,0.50374997,0.34,-37.98 +0.33,0.4869,0.33,-38.024998 +0.32,0.47014999,0.32,-38.077499 +0.31,0.45397499,0.31,-38.127502 +0.3,0.43807498,0.3,-38.1675 +0.29,0.42202502,0.29,-38.199997 +0.28,0.40637502,0.28,-38.23 +0.27,0.39075002,0.27,-38.262501 +0.26,0.37542501,0.26,-38.2925 +0.25,0.36015001,0.25,-38.314999 +0.24,0.34505001,0.24,-38.350002 +0.23,0.3301,0.23,-38.377502 +0.22,0.31507501,0.22,-38.392498 +0.21,0.3003,0.21,-38.397499 +0.2,0.28544998,0.2,-38.4175 +0.19,0.27085,0.19,-38.407501 +0.18,0.2563,0.18,-38.407501 +0.17,0.24162501,0.17,-38.392498 +0.16,0.227175,0.16,-38.377502 +0.15,0.21268,0.15,-38.3675 +0.14,0.1983775,0.14,-38.355 +0.13,0.1839475,0.13,-38.3675 +0.12,0.16974999,0.12,-38.392498 +0.11,0.15553249,0.11,-38.384998 +0.1,0.1412425,0.1,-38.407501 +0.09,0.1271075,0.09,-38.422501 +0.08,0.112875,0.08,-38.4575 +0.07,0.098822497,0.07,-38.454998 +0.06,0.084615,0.06,-38.467499 +0.05,0.070565,0.05,-38.497501 +0.04,0.056542501,0.04,-38.59 +0.03,0.042374998,0.03,-38.580002 +0.02,0.0283625,0.02,-38.572502 +0.01,0.014097,0.01,-38.672501 +0,2.44E-06,0,-38.602501 +-0.01,-0.01378575,-0.01,-38.559998 +-0.02,-0.0279375,-0.02,-38.607502 +-0.03,-0.042092498,-0.03,-38.600002 +-0.04,-0.056115001,-0.04,-38.6175 +-0.05,-0.070282497,-0.05,-38.685001 +-0.06,-0.084327497,-0.06,-38.657501 +-0.07,-0.098379999,-0.07,-38.6675 +-0.08,-0.11255,-0.08,-38.715 +-0.09,-0.12662999,-0.09,-38.7225 +-0.1,-0.14086249,-0.1,-38.75 +-0.11,-0.15495001,-0.11,-38.772503 +-0.12,-0.16922,-0.12,-38.745003 +-0.13,-0.1833525,-0.13,-38.789997 +-0.14,-0.19763751,-0.14,-38.782501 +-0.15,-0.2118275,-0.15,-38.795002 +-0.16,-0.2261425,-0.16,-38.810001 +-0.17,-0.24029,-0.17,-38.827499 +-0.18,-0.25400001,-0.18,-38.817497 +-0.19,-0.26815,-0.19,-38.830002 +-0.2,-0.28235,-0.2,-38.84 +-0.21,-0.29664999,-0.21,-38.844997 +-0.22,-0.310875,-0.22,-38.857502 +-0.23,-0.32525,-0.23,-38.872498 +-0.24,-0.33949998,-0.24,-38.895 +-0.25,-0.35384998,-0.25,-38.9025 +-0.26,-0.36810002,-0.26,-38.932499 +-0.27,-0.38249999,-0.27,-38.9375 +-0.28,-0.39679998,-0.28,-38.927498 +-0.29,-0.41125,-0.29,-38.93 +-0.3,-0.42550001,-0.3,-38.950001 +-0.31,-0.43985,-0.31,-38.98 +-0.32,-0.45434999,-0.32,-39.025002 +-0.33,-0.46864998,-0.33,-39.050003 +-0.34,-0.483125,-0.34,-39.057499 +-0.35,-0.49752498,-0.35,-39.052502 +-0.36,-0.51200002,-0.36,-39.064999 +-0.37,-0.52632505,-0.37,-39.074997 +-0.38,-0.54092503,-0.38,-39.105003 +-0.39,-0.5553,-0.39,-39.119999 +-0.4,-0.56974995,-0.4,-39.154999 +-0.41,-0.584225,-0.41,-39.195 +-0.42,-0.598625,-0.42,-39.209999 +-0.43,-0.61330003,-0.43,-39.232498 +-0.44,-0.62774998,-0.44,-39.262501 +-0.45,-0.64230001,-0.45,-39.299999 +-0.46,-0.65672505,-0.46,-39.3325 +-0.47,-0.67202502,-0.47,-39.349998 +-0.48,-0.68667501,-0.48,-39.372501 +-0.49,-0.70147502,-0.49,-39.3825 +-0.5,-0.71597499,-0.5,-39.4025 \ No newline at end of file diff --git a/tests/test_files/Junction.txt b/tests/test_files/Junction.txt new file mode 100644 index 0000000..feda2a2 --- /dev/null +++ b/tests/test_files/Junction.txt @@ -0,0 +1,10 @@ +junc: +Eg = 1.10 eV, TC = 25.0 C +Jext = 40.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 15, gamma = 0 + n J0ratio J0(A/cm2) + db 1 1.314e-16 + 1.00 10.00 1.314e-15 + 2.00 10.00 3.625e-09 \ No newline at end of file diff --git a/tests/test_files/Multi2T_str.txt b/tests/test_files/Multi2T_str.txt new file mode 100644 index 0000000..99db181 --- /dev/null +++ b/tests/test_files/Multi2T_str.txt @@ -0,0 +1,24 @@ +Multi2T: +T = 25.0 C, Rs2T= 0 Ω cm2 + +j[0]: +Eg = 1.80 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 0, gamma = 0 + n J0ratio J0(A/cm2) + db 1 5.082e-28 + 1.00 10.00 5.082e-27 + 2.00 10.00 7.129e-15 + +j[1]: +Eg = 1.40 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 15, gamma = 0 + n J0ratio J0(A/cm2) + db 1 1.789e-21 + 1.00 10.00 1.789e-20 + 2.00 10.00 1.338e-11 \ No newline at end of file diff --git a/tests/test_files/Pvsk_1.70MA-free_JV.csv b/tests/test_files/Pvsk_1.70MA-free_JV.csv new file mode 100644 index 0000000..f7b127d --- /dev/null +++ b/tests/test_files/Pvsk_1.70MA-free_JV.csv @@ -0,0 +1,66 @@ +v,i +1.27,-33.9158 +1.24969,-22.5285 +1.22938,-11.2617 +1.20906,-2.04326 +1.18875,4.94565 +1.16844,9.84993 +1.14813,13.1156 +1.12781,15.2362 +1.1075,16.5978 +1.08719,17.5258 +1.06688,18.1162 +1.04656,18.4777 +1.02625,18.7428 +1.00594,18.9114 +0.985625,19.0319 +0.965313,19.0802 +0.945,19.1524 +0.924687,19.1524 +0.904375,19.2007 +0.884062,19.2127 +0.86375,19.1886 +0.843438,19.2127 +0.823125,19.1765 +0.802812,19.1644 +0.7825,19.2127 +0.762188,19.2248 +0.741875,19.2127 +0.721562,19.2127 +0.70125,19.2127 +0.680937,19.2127 +0.660625,19.1644 +0.640312,19.1886 +0.62,19.2248 +0.599688,19.261 +0.579375,19.2248 +0.559063,19.261 +0.53875,19.249 +0.518437,19.249 +0.498125,19.2127 +0.477812,19.261 +0.4575,19.2127 +0.437187,19.261 +0.416875,19.2248 +0.396563,19.249 +0.37625,19.2369 +0.355938,19.249 +0.335625,19.249 +0.315312,19.2729 +0.295,19.2849 +0.274687,19.297 +0.254375,19.3091 +0.234063,19.2729 +0.21375,19.297 +0.193437,19.2849 +0.173125,19.261 +0.152813,19.2729 +0.1325,19.3091 +0.112187,19.3212 +0.091875,19.3453 +0.0715625,19.3212 +0.05125,19.2729 +0.0309375,19.297 +0.010625,19.2729 +-0.0096875,19.2849 +-0.03,19.297 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_I3Trel-r.txt b/tests/test_files/Tandem3T_I3Trel-r.txt new file mode 100644 index 0000000..5e55657 --- /dev/null +++ b/tests/test_files/Tandem3T_I3Trel-r.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (30, 30), 'xkey': 'VA', 'ykey': 'VB', 'x': (-1.5, 0.2), 'y': (-1.5, 0.2)} +sizes(900, 900) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -373.52 360.24 13.97 1.500 -1.500 0.000 -373.52 13.97 -1.500 -1.500 -539.33 -274.00 415.57 1.061 -1.732 + (0, 1) -319.70 305.78 13.91 1.500 -1.441 -0.059 -319.70 13.91 -1.441 -1.500 -439.94 -235.90 353.09 1.102 -1.664 + (0, 2) -266.30 252.05 13.74 1.500 -1.383 -0.117 -266.30 13.74 -1.383 -1.500 -347.61 -198.02 291.33 1.144 -1.597 + (0, 3) -212.89 199.39 13.25 1.500 -1.324 -0.176 -212.89 13.25 -1.324 -1.500 -262.02 -159.91 230.38 1.185 -1.529 + (0, 4) -160.04 148.26 11.75 1.500 -1.266 -0.234 -160.04 11.75 -1.266 -1.500 -184.92 -121.47 171.22 1.226 -1.461 + (0, 5) -106.32 99.59 6.73 1.500 -1.207 -0.293 -106.32 6.73 -1.207 -1.500 -118.22 -79.93 115.00 1.268 -1.394 + (0, 6) -43.33 54.82 -11.31 1.500 -1.148 -0.352 -43.33 -11.31 -1.148 -1.500 -66.72 -22.64 63.20 1.309 -1.326 + (0, 7) 80.45 10.32 -90.83 1.500 -1.090 -0.410 80.45 -90.83 -1.090 -1.500 -48.58 121.11 11.95 1.351 -1.258 + (0, 8) nan nan nan 1.500 -1.031 -0.469 nan nan -1.031 -1.500 -100000.00 nan nan 1.392 -1.191 + (0, 9) nan nan nan 1.500 -0.972 -0.528 nan nan -0.972 -1.500 -100000.00 nan nan 1.434 -1.123 + + +(29, 21) 14.00 -28.05 14.00 -0.200 -0.269 0.469 14.00 14.00 -0.269 0.200 0.97 0.00 -32.36 -0.473 -0.311 +(29, 22) 14.00 -28.05 14.00 -0.200 -0.210 0.410 14.00 14.00 -0.210 0.200 0.14 0.00 -32.36 -0.432 -0.243 +(29, 23) 14.00 -28.05 14.00 -0.200 -0.152 0.352 14.00 14.00 -0.152 0.200 -0.68 0.00 -32.36 -0.390 -0.175 +(29, 24) 14.00 -28.05 14.00 -0.200 -0.093 0.293 14.00 14.00 -0.093 0.200 -1.50 0.00 -32.36 -0.349 -0.108 +(29, 25) 14.00 -28.05 14.00 -0.200 -0.034 0.234 14.00 14.00 -0.034 0.200 -2.32 0.00 -32.36 -0.307 -0.040 +(29, 26) 14.00 -28.05 14.00 -0.200 0.024 0.176 14.00 14.00 0.024 0.200 -3.14 0.00 -32.36 -0.266 0.028 +(29, 27) 14.00 -28.05 14.00 -0.200 0.083 0.117 14.00 14.00 0.083 0.200 -3.96 0.00 -32.36 -0.224 0.096 +(29, 28) 14.00 -28.05 14.00 -0.200 0.141 0.059 14.00 14.00 0.141 0.200 -4.78 0.00 -32.36 -0.183 0.163 +(29, 29) 14.00 -28.05 14.00 -0.200 0.200 0.000 14.00 14.00 0.200 0.200 -5.60 0.00 -32.36 -0.141 0.231 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_I3Trel-s.txt b/tests/test_files/Tandem3T_I3Trel-s.txt new file mode 100644 index 0000000..e282bfb --- /dev/null +++ b/tests/test_files/Tandem3T_I3Trel-s.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (30, 30), 'xkey': 'VA', 'ykey': 'VB', 'x': (-1.5, 0.2), 'y': (-1.5, 0.2)} +sizes(900, 900) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -37.31 51.46 -14.01 1.500 -1.500 0.000 -37.31 -14.01 -1.500 -1.500 -76.98 -16.48 59.34 1.061 -1.732 + (0, 1) -37.31 51.46 -14.01 1.500 -1.441 -0.059 -37.31 -14.01 -1.441 -1.500 -74.80 -16.48 59.34 1.102 -1.664 + (0, 2) -37.31 51.46 -14.01 1.500 -1.383 -0.117 -37.31 -14.01 -1.383 -1.500 -72.61 -16.48 59.34 1.144 -1.597 + (0, 3) -37.31 51.46 -14.01 1.500 -1.324 -0.176 -37.31 -14.01 -1.324 -1.500 -70.42 -16.48 59.34 1.185 -1.529 + (0, 4) -37.31 51.46 -14.01 1.500 -1.266 -0.234 -37.31 -14.01 -1.266 -1.500 -68.23 -16.48 59.34 1.226 -1.461 + (0, 5) -37.31 51.46 -14.01 1.500 -1.207 -0.293 -37.31 -14.01 -1.207 -1.500 -66.05 -16.48 59.34 1.268 -1.394 + (0, 6) -37.31 51.46 -14.01 1.500 -1.148 -0.352 -37.31 -14.01 -1.148 -1.500 -63.86 -16.48 59.34 1.309 -1.326 + (0, 7) -37.31 51.46 -14.01 1.500 -1.090 -0.410 -37.31 -14.01 -1.090 -1.500 -61.67 -16.48 59.34 1.351 -1.258 + (0, 8) -37.31 51.46 -14.01 1.500 -1.031 -0.469 -37.31 -14.01 -1.031 -1.500 -59.48 -16.48 59.34 1.392 -1.191 + (0, 9) -37.31 51.46 -14.01 1.500 -0.972 -0.528 -37.31 -14.01 -0.972 -1.500 -57.30 -16.48 59.34 1.434 -1.123 + + +(29, 21) -14.00 0.05 14.00 -0.200 -0.269 0.469 -14.00 14.00 -0.269 0.200 -6.57 -19.80 0.03 -0.473 -0.311 +(29, 22) -14.00 0.05 14.00 -0.200 -0.210 0.410 -14.00 14.00 -0.210 0.200 -5.74 -19.80 0.03 -0.432 -0.243 +(29, 23) -14.00 0.05 14.00 -0.200 -0.152 0.352 -14.00 14.00 -0.152 0.200 -4.92 -19.80 0.03 -0.390 -0.175 +(29, 24) -14.00 0.05 14.00 -0.200 -0.093 0.293 -14.00 14.00 -0.093 0.200 -4.10 -19.80 0.03 -0.349 -0.108 +(29, 25) -14.00 0.05 14.00 -0.200 -0.034 0.234 -14.00 14.00 -0.034 0.200 -3.28 -19.80 0.03 -0.307 -0.040 +(29, 26) -14.00 0.05 14.00 -0.200 0.024 0.176 -14.00 14.00 0.024 0.200 -2.46 -19.80 0.03 -0.266 0.028 +(29, 27) -14.00 0.05 14.00 -0.200 0.083 0.117 -14.00 14.00 0.083 0.200 -1.64 -19.80 0.03 -0.224 0.096 +(29, 28) -14.00 0.05 14.00 -0.200 0.141 0.059 -14.00 14.00 0.141 0.200 -0.82 -19.80 0.03 -0.183 0.163 +(29, 29) -14.00 0.04 14.00 -0.200 0.200 0.000 -14.00 14.00 0.200 0.200 0.00 -19.80 0.03 -0.141 0.231 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_J3TAabs-r.txt b/tests/test_files/Tandem3T_J3TAabs-r.txt new file mode 100644 index 0000000..8d6af21 --- /dev/null +++ b/tests/test_files/Tandem3T_J3TAabs-r.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (30, 30), 'xkey': 'VA', 'ykey': 'VB', 'x': (-1.5, 0.2), 'y': (-1.5, 0.2)} +sizes(900, 900) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -405537031.19 1500.00 14.00 1.500 -1.500 0.000 nan nan -1.500 -1.500 nan nan nan nan nan + (0, 1) -41426744.18 1500.00 14.00 1.500 -1.441 -0.059 nan nan -1.441 -1.500 nan nan nan nan nan + (0, 2) -4234856.94 1500.00 14.00 1.500 -1.383 -0.117 nan nan -1.383 -1.500 nan nan nan nan nan + (0, 3) -433859.41 1500.00 14.00 1.500 -1.324 -0.176 nan nan -1.324 -1.500 nan nan nan nan nan + (0, 4) -44744.42 1500.00 14.00 1.500 -1.266 -0.234 nan nan -1.266 -1.500 nan nan nan nan nan + (0, 5) -4701.06 1500.00 14.00 1.500 -1.207 -0.293 nan nan -1.207 -1.500 nan nan nan nan nan + (0, 6) -513.64 1500.00 14.00 1.500 -1.148 -0.352 nan nan -1.148 -1.500 nan nan nan nan nan + (0, 7) -54.63 1500.00 14.00 1.500 -1.090 -0.410 nan nan -1.090 -1.500 nan nan nan nan nan + (0, 8) 2.28 1500.00 14.00 1.500 -1.031 -0.469 nan nan -1.031 -1.500 nan nan nan nan nan + (0, 9) 11.30 1500.00 14.00 1.500 -0.972 -0.528 nan nan -0.972 -1.500 nan nan nan nan nan + + +(29, 21) 14.00 -200.00 14.00 -0.200 -0.269 0.469 nan nan -0.269 0.200 nan nan nan nan nan +(29, 22) 14.00 -200.00 14.00 -0.200 -0.210 0.410 nan nan -0.210 0.200 nan nan nan nan nan +(29, 23) 14.00 -200.00 14.00 -0.200 -0.152 0.352 nan nan -0.152 0.200 nan nan nan nan nan +(29, 24) 14.00 -200.00 14.00 -0.200 -0.093 0.293 nan nan -0.093 0.200 nan nan nan nan nan +(29, 25) 14.00 -200.00 14.00 -0.200 -0.034 0.234 nan nan -0.034 0.200 nan nan nan nan nan +(29, 26) 14.00 -200.00 14.00 -0.200 0.024 0.176 nan nan 0.024 0.200 nan nan nan nan nan +(29, 27) 14.00 -200.00 14.00 -0.200 0.083 0.117 nan nan 0.083 0.200 nan nan nan nan nan +(29, 28) 14.00 -200.00 14.00 -0.200 0.141 0.059 nan nan 0.141 0.200 nan nan nan nan nan +(29, 29) 14.00 -200.00 14.00 -0.200 0.200 0.000 nan nan 0.200 0.200 nan nan nan nan nan \ No newline at end of file diff --git a/tests/test_files/Tandem3T_J3TAabs-s.txt b/tests/test_files/Tandem3T_J3TAabs-s.txt new file mode 100644 index 0000000..96e8781 --- /dev/null +++ b/tests/test_files/Tandem3T_J3TAabs-s.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (30, 30), 'xkey': 'VA', 'ykey': 'VB', 'x': (-1.5, 0.2), 'y': (-1.5, 0.2)} +sizes(900, 900) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -14.00 1500.00 14.00 1.500 -1.500 0.000 nan nan -1.500 -1.500 nan nan nan nan nan + (0, 1) -14.00 1500.00 14.00 1.500 -1.441 -0.059 nan nan -1.441 -1.500 nan nan nan nan nan + (0, 2) -14.00 1500.00 14.00 1.500 -1.383 -0.117 nan nan -1.383 -1.500 nan nan nan nan nan + (0, 3) -14.00 1500.00 14.00 1.500 -1.324 -0.176 nan nan -1.324 -1.500 nan nan nan nan nan + (0, 4) -14.00 1500.00 14.00 1.500 -1.266 -0.234 nan nan -1.266 -1.500 nan nan nan nan nan + (0, 5) -14.00 1500.00 14.00 1.500 -1.207 -0.293 nan nan -1.207 -1.500 nan nan nan nan nan + (0, 6) -14.00 1500.00 14.00 1.500 -1.148 -0.352 nan nan -1.148 -1.500 nan nan nan nan nan + (0, 7) -14.00 1500.00 14.00 1.500 -1.090 -0.410 nan nan -1.090 -1.500 nan nan nan nan nan + (0, 8) -14.00 1500.00 14.00 1.500 -1.031 -0.469 nan nan -1.031 -1.500 nan nan nan nan nan + (0, 9) -14.00 1500.00 14.00 1.500 -0.972 -0.528 nan nan -0.972 -1.500 nan nan nan nan nan + + +(29, 21) -14.00 -200.00 14.00 -0.200 -0.269 0.469 nan nan -0.269 0.200 nan nan nan nan nan +(29, 22) -14.00 -200.00 14.00 -0.200 -0.210 0.410 nan nan -0.210 0.200 nan nan nan nan nan +(29, 23) -14.00 -200.00 14.00 -0.200 -0.152 0.352 nan nan -0.152 0.200 nan nan nan nan nan +(29, 24) -14.00 -200.00 14.00 -0.200 -0.093 0.293 nan nan -0.093 0.200 nan nan nan nan nan +(29, 25) -14.00 -200.00 14.00 -0.200 -0.034 0.234 nan nan -0.034 0.200 nan nan nan nan nan +(29, 26) -14.00 -200.00 14.00 -0.200 0.024 0.176 nan nan 0.024 0.200 nan nan nan nan nan +(29, 27) -14.00 -200.00 14.00 -0.200 0.083 0.117 nan nan 0.083 0.200 nan nan nan nan nan +(29, 28) -14.00 -200.00 14.00 -0.200 0.141 0.059 nan nan 0.141 0.200 nan nan nan nan nan +(29, 29) -14.00 -200.00 14.00 -0.200 0.200 0.000 nan nan 0.200 0.200 nan nan nan nan nan \ No newline at end of file diff --git a/tests/test_files/Tandem3T_V3T-r.txt b/tests/test_files/Tandem3T_V3T-r.txt new file mode 100644 index 0000000..c2f9e4d --- /dev/null +++ b/tests/test_files/Tandem3T_V3T-r.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (55, 55), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(3025, 3025) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -25.00 55.00 -30.00 1.518 -1.152 -0.367 -25.00 -30.00 -1.152 -1.518 -74.33 3.54 63.51 1.333 -1.330 + (0, 1) -24.07 54.07 -30.00 1.517 -1.150 -0.367 -24.07 -30.00 -1.150 -1.517 -73.21 4.19 62.44 1.332 -1.328 + (0, 2) -23.15 53.15 -30.00 1.516 -1.149 -0.367 -23.15 -30.00 -1.149 -1.516 -72.09 4.84 61.37 1.332 -1.327 + (0, 3) -22.22 52.22 -30.00 1.515 -1.148 -0.368 -22.22 -30.00 -1.148 -1.515 -70.97 5.50 60.30 1.331 -1.325 + (0, 4) -21.30 51.30 -30.00 1.514 -1.147 -0.368 -21.30 -30.00 -1.147 -1.514 -69.85 6.15 59.23 1.331 -1.324 + (0, 5) -20.37 50.37 -30.00 1.514 -1.145 -0.368 -20.37 -30.00 -1.145 -1.514 -68.73 6.81 58.16 1.331 -1.322 + (0, 6) -19.44 49.44 -30.00 1.513 -1.144 -0.369 -19.44 -30.00 -1.144 -1.513 -67.62 7.46 57.09 1.330 -1.321 + (0, 7) -18.52 48.52 -30.00 1.512 -1.143 -0.369 -18.52 -30.00 -1.143 -1.512 -66.51 8.12 56.02 1.330 -1.319 + (0, 8) -17.59 47.59 -30.00 1.511 -1.141 -0.369 -17.59 -30.00 -1.141 -1.511 -65.40 8.77 54.96 1.329 -1.318 + (0, 9) -16.67 46.67 -30.00 1.510 -1.140 -0.370 -16.67 -30.00 -1.140 -1.510 -64.30 9.43 53.89 1.329 -1.317 + + +(54, 46) 17.59 -47.59 30.00 nan -0.920 nan 17.59 30.00 nan nan -100000.00 -8.77 -54.96 nan nan +(54, 47) 18.52 -48.52 30.00 nan -0.897 nan 18.52 30.00 nan nan -100000.00 -8.12 -56.02 nan nan +(54, 48) 19.44 -49.44 30.00 nan -0.849 nan 19.44 30.00 nan nan -100000.00 -7.46 -57.09 nan nan +(54, 49) 20.37 -50.37 30.00 nan nan nan 20.37 30.00 nan nan -100000.00 -6.81 -58.16 nan nan +(54, 50) 21.30 -51.30 30.00 nan nan nan 21.30 30.00 nan nan -100000.00 -6.15 -59.23 nan nan +(54, 51) 22.22 -52.22 30.00 nan nan nan 22.22 30.00 nan nan -100000.00 -5.50 -60.30 nan nan +(54, 52) 23.15 -53.15 30.00 nan nan nan 23.15 30.00 nan nan -100000.00 -4.84 -61.37 nan nan +(54, 53) 24.07 -54.07 30.00 nan nan nan 24.07 30.00 nan nan -100000.00 -4.19 -62.44 nan nan +(54, 54) 25.00 -55.00 30.00 nan nan nan 25.00 30.00 nan nan -100000.00 -3.54 -63.51 nan nan \ No newline at end of file diff --git a/tests/test_files/Tandem3T_V3T-s.txt b/tests/test_files/Tandem3T_V3T-s.txt new file mode 100644 index 0000000..d1dd4e6 --- /dev/null +++ b/tests/test_files/Tandem3T_V3T-s.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (55, 55), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(3025, 3025) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -25.00 55.00 -30.00 1.518 1.009 -2.527 -25.00 -30.00 1.009 -1.518 -20.33 3.54 63.51 2.860 1.165 + (0, 1) -24.07 54.07 -30.00 1.517 1.011 -2.528 -24.07 -30.00 1.011 -1.517 -21.19 4.19 62.44 2.860 1.167 + (0, 2) -23.15 53.15 -30.00 1.516 1.012 -2.529 -23.15 -30.00 1.012 -1.516 -22.05 4.84 61.37 2.860 1.169 + (0, 3) -22.22 52.22 -30.00 1.515 1.014 -2.530 -22.22 -30.00 1.014 -1.515 -22.92 5.50 60.30 2.860 1.171 + (0, 4) -21.30 51.30 -30.00 1.514 1.016 -2.531 -21.30 -30.00 1.016 -1.514 -23.79 6.15 59.23 2.860 1.173 + (0, 5) -20.37 50.37 -30.00 1.514 1.018 -2.531 -20.37 -30.00 1.018 -1.514 -24.67 6.81 58.16 2.860 1.175 + (0, 6) -19.44 49.44 -30.00 1.513 1.020 -2.532 -19.44 -30.00 1.020 -1.513 -25.55 7.46 57.09 2.860 1.178 + (0, 7) -18.52 48.52 -30.00 1.512 1.021 -2.533 -18.52 -30.00 1.021 -1.512 -26.43 8.12 56.02 2.860 1.179 + (0, 8) -17.59 47.59 -30.00 1.511 1.023 -2.534 -17.59 -30.00 1.023 -1.511 -27.32 8.77 54.96 2.860 1.181 + (0, 9) -16.67 46.67 -30.00 1.510 1.025 -2.535 -16.67 -30.00 1.025 -1.510 -28.21 9.43 53.89 2.860 1.183 + + +(54, 46) 17.59 -47.59 30.00 nan 1.113 nan 17.59 30.00 nan nan -100000.00 -8.77 -54.96 nan nan +(54, 47) 18.52 -48.52 30.00 nan 1.115 nan 18.52 30.00 nan nan -100000.00 -8.12 -56.02 nan nan +(54, 48) 19.44 -49.44 30.00 nan 1.117 nan 19.44 30.00 nan nan -100000.00 -7.46 -57.09 nan nan +(54, 49) 20.37 -50.37 30.00 nan 1.118 nan 20.37 30.00 nan nan -100000.00 -6.81 -58.16 nan nan +(54, 50) 21.30 -51.30 30.00 nan 1.120 nan 21.30 30.00 nan nan -100000.00 -6.15 -59.23 nan nan +(54, 51) 22.22 -52.22 30.00 nan 1.122 nan 22.22 30.00 nan nan -100000.00 -5.50 -60.30 nan nan +(54, 52) 23.15 -53.15 30.00 nan 1.124 nan 23.15 30.00 nan nan -100000.00 -4.84 -61.37 nan nan +(54, 53) 24.07 -54.07 30.00 nan 1.125 nan 24.07 30.00 nan nan -100000.00 -4.19 -62.44 nan nan +(54, 54) 25.00 -55.00 30.00 nan 1.127 nan 25.00 30.00 nan nan -100000.00 -3.54 -63.51 nan nan \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VI0_VrzIto.txt b/tests/test_files/Tandem3T_VI0_VrzIto.txt new file mode 100644 index 0000000..056288c --- /dev/null +++ b/tests/test_files/Tandem3T_VI0_VrzIto.txt @@ -0,0 +1,6 @@ +VrzIto: +{'name': 'VrzIto', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -23.23 23.23 0.00 1.448 0.000 -1.448 -23.23 0.00 0.000 -1.448 0.00 -16.42 26.82 2.048 0.000 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VI0_VtrIzo.txt b/tests/test_files/Tandem3T_VI0_VtrIzo.txt new file mode 100644 index 0000000..c8e39e7 --- /dev/null +++ b/tests/test_files/Tandem3T_VI0_VtrIzo.txt @@ -0,0 +1,6 @@ +VtrIzo: +{'name': 'VtrIzo', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -14.00 0.00 14.00 0.460 0.084 -0.545 -14.00 14.00 0.084 -0.460 7.63 -19.80 0.00 0.711 0.097 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VI0_VztIro.txt b/tests/test_files/Tandem3T_VI0_VztIro.txt new file mode 100644 index 0000000..f5a18ca --- /dev/null +++ b/tests/test_files/Tandem3T_VI0_VztIro.txt @@ -0,0 +1,6 @@ +VztIro: +{'name': 'VztIro', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) 0.00 -14.00 14.00 0.000 1.051 -1.051 0.00 14.00 1.051 0.000 0.00 -9.90 -16.17 0.743 1.214 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VIpoint_IroVyhex.txt b/tests/test_files/Tandem3T_VIpoint_IroVyhex.txt new file mode 100644 index 0000000..1a09efb --- /dev/null +++ b/tests/test_files/Tandem3T_VIpoint_IroVyhex.txt @@ -0,0 +1,6 @@ +IroVyhex: +{'name': 'IroVyhex', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) 0.00 -11.05 11.05 1.352 1.051 -2.403 0.00 11.05 1.051 -1.352 14.94 -7.81 -12.76 2.656 1.213 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VIpoint_ItoVtr.txt b/tests/test_files/Tandem3T_VIpoint_ItoVtr.txt new file mode 100644 index 0000000..f2780b3 --- /dev/null +++ b/tests/test_files/Tandem3T_VIpoint_ItoVtr.txt @@ -0,0 +1,6 @@ +ItoVtr: +{'name': 'ItoVtr', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -12.90 12.90 0.00 1.438 1.013 -2.451 -12.90 0.00 1.013 -1.438 13.07 -9.12 14.90 2.750 1.170 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VIpoint_ItoVxhex.txt b/tests/test_files/Tandem3T_VIpoint_ItoVxhex.txt new file mode 100644 index 0000000..ceeb7d9 --- /dev/null +++ b/tests/test_files/Tandem3T_VIpoint_ItoVxhex.txt @@ -0,0 +1,6 @@ +ItoVxhex: +{'name': 'ItoVxhex', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -15.10 15.10 0.00 1.440 1.002 -2.442 -15.10 0.00 1.002 -1.440 15.13 -10.68 17.44 2.745 1.157 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VIpoint_IzoVrz.txt b/tests/test_files/Tandem3T_VIpoint_IzoVrz.txt new file mode 100644 index 0000000..33655c2 --- /dev/null +++ b/tests/test_files/Tandem3T_VIpoint_IzoVrz.txt @@ -0,0 +1,6 @@ +IzoVrz: +{'name': 'IzoVrz', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -14.00 0.00 14.00 0.053 0.000 -0.053 -14.00 14.00 0.000 -0.053 0.75 -19.80 0.00 0.075 0.000 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_VIpoint_IzoVxhex.txt b/tests/test_files/Tandem3T_VIpoint_IzoVxhex.txt new file mode 100644 index 0000000..7fbf9a9 --- /dev/null +++ b/tests/test_files/Tandem3T_VIpoint_IzoVxhex.txt @@ -0,0 +1,6 @@ +IzoVxhex: +{'name': 'IzoVxhex', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -14.00 0.00 14.00 0.053 0.000 -0.053 -14.00 14.00 0.000 -0.053 0.75 -19.80 0.00 0.075 0.000 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vm_11.txt b/tests/test_files/Tandem3T_iv3t_vm_11.txt new file mode 100644 index 0000000..6b3fc70 --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vm_11.txt @@ -0,0 +1,26 @@ +VM11: +{'name': 'VM11', 'meastype': 'CZ', 'area': 1.0, 'shape': (41,)} +sizes(41, 41) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM11_0 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 +VM11_0 -14.00 0.05 14.00 0.142 0.142 -0.285 -14.00 14.00 0.142 -0.142 3.99 -19.80 0.03 0.302 0.165 +VM11_0 -14.00 0.02 14.00 0.285 0.285 -0.570 -14.00 14.00 0.285 -0.285 7.98 -19.80 0.01 0.604 0.329 +VM11_0 -14.00 0.05 14.00 0.427 0.427 -0.855 -14.00 14.00 0.427 -0.427 11.97 -19.80 0.03 0.907 0.494 +VM11_0 -14.00 0.05 14.00 0.570 0.570 -1.140 -14.00 14.00 0.570 -0.570 15.96 -19.80 0.03 1.209 0.658 +VM11_0 -13.99 0.03 14.00 0.712 0.712 -1.425 -13.99 14.00 0.712 -0.712 19.94 -19.79 0.01 1.511 0.823 +VM11_1 -13.99 0.03 14.00 0.712 0.712 -1.425 -13.99 14.00 0.712 -0.712 19.94 -19.79 0.01 1.511 0.823 +VM11_1 -13.98 0.03 14.00 0.741 0.741 -1.482 -13.98 14.00 0.741 -0.741 20.73 -19.78 0.00 1.572 0.855 +VM11_1 -13.96 0.01 14.00 0.769 0.769 -1.539 -13.96 14.00 0.769 -0.769 21.51 -19.77 -0.02 1.632 0.888 +VM11_1 -13.93 -0.03 14.00 0.798 0.798 -1.596 -13.93 14.00 0.798 -0.798 22.28 -19.75 -0.06 1.692 0.921 + + +VM11_2 -12.55 -1.40 14.00 0.946 0.946 -1.892 -12.55 14.00 0.946 -0.946 25.11 -18.77 -1.65 2.007 1.092 +VM11_3 -12.55 -1.40 14.00 0.946 0.946 -1.892 -12.55 14.00 0.946 -0.946 25.11 -18.77 -1.65 2.007 1.092 +VM11_2 -12.36 -1.59 14.00 0.952 0.952 -1.903 -12.36 14.00 0.952 -0.952 25.09 -18.64 -1.86 2.019 1.099 +VM11_2 -12.15 -1.80 14.00 0.957 0.957 -1.915 -12.15 14.00 0.957 -0.957 25.04 -18.49 -2.11 2.031 1.106 +VM11_2 -11.91 -2.04 14.00 0.963 0.963 -1.926 -11.91 14.00 0.963 -0.963 24.95 -18.32 -2.38 2.043 1.112 +VM11_1 -11.64 -2.31 14.00 0.969 0.969 -1.938 -11.64 14.00 0.969 -0.969 24.84 -18.13 -2.70 2.055 1.119 +VM11_2 -11.64 -2.31 14.00 0.969 0.969 -1.938 -11.64 14.00 0.969 -0.969 24.84 -18.13 -2.70 2.055 1.119 +VM11_0 -9.61 -4.35 14.00 0.997 0.997 -1.995 -9.61 14.00 0.997 -0.997 23.54 -16.69 -5.04 2.116 1.152 +VM11_1 -9.61 -4.35 14.00 0.997 0.997 -1.995 -9.61 14.00 0.997 -0.997 23.54 -16.69 -5.04 2.116 1.152 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vm_21.txt b/tests/test_files/Tandem3T_iv3t_vm_21.txt new file mode 100644 index 0000000..4743306 --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vm_21.txt @@ -0,0 +1,26 @@ +VM21: +{'name': 'VM21', 'meastype': 'CZ', 'area': 1.0, 'shape': (41,)} +sizes(41, 41) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM21_0 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 +VM21_0 -14.00 0.05 14.00 0.211 0.105 -0.316 -14.00 14.00 0.105 -0.211 4.43 -19.80 0.03 0.373 0.122 +VM21_0 -14.00 0.04 14.00 0.422 0.211 -0.633 -14.00 14.00 0.211 -0.422 8.86 -19.80 0.03 0.746 0.244 +VM21_0 -14.00 0.01 14.00 0.633 0.316 -0.949 -14.00 14.00 0.316 -0.633 13.29 -19.80 0.01 1.119 0.365 +VM21_0 -14.00 -0.05 14.00 0.844 0.422 -1.266 -14.00 14.00 0.422 -0.844 17.72 -19.80 -0.03 1.492 0.487 +VM21_0 -14.00 -0.04 13.99 1.055 0.527 -1.582 -14.00 13.99 0.527 -1.055 22.15 -19.79 -0.02 1.865 0.609 +VM21_1 -14.00 -0.04 13.99 1.055 0.527 -1.582 -14.00 13.99 0.527 -1.055 22.15 -19.79 -0.02 1.865 0.609 +VM21_1 -14.00 -0.04 13.99 1.097 0.549 -1.646 -14.00 13.99 0.549 -1.097 23.03 -19.79 -0.01 1.940 0.633 +VM21_1 -14.00 -0.02 13.97 1.139 0.570 -1.709 -14.00 13.97 0.570 -1.139 23.89 -19.78 0.01 2.014 0.658 +VM21_1 -14.00 0.02 13.93 1.182 0.591 -1.772 -14.00 13.93 0.591 -1.182 24.73 -19.75 0.05 2.089 0.682 + + +VM21_2 -14.18 1.34 12.78 1.325 0.663 -1.988 -14.18 12.78 0.663 -1.325 26.33 -19.06 1.58 2.342 0.765 +VM21_2 -14.24 1.64 12.55 1.334 0.667 -2.000 -14.24 12.55 0.667 -1.334 26.23 -18.94 1.93 2.357 0.770 +VM21_2 -14.33 2.02 12.27 1.342 0.671 -2.013 -14.33 12.27 0.671 -1.342 26.08 -18.81 2.36 2.372 0.775 +VM21_1 -14.46 2.48 11.93 1.350 0.675 -2.026 -14.46 11.93 0.675 -1.350 25.87 -18.66 2.89 2.387 0.780 +VM21_2 -14.46 2.48 11.93 1.350 0.675 -2.026 -14.46 11.93 0.675 -1.350 25.87 -18.66 2.89 2.387 0.780 +VM21_1 -16.00 6.95 8.99 1.393 0.696 -2.089 -16.00 8.99 0.696 -1.393 23.66 -17.67 8.06 2.462 0.804 +VM21_1 -20.74 18.04 2.78 1.435 0.717 -2.152 -20.74 2.78 0.717 -1.435 18.86 -16.63 20.79 2.536 0.828 +VM21_0 -30.31 37.55 -7.35 1.477 0.738 -2.215 -30.31 -7.35 0.738 -1.477 11.53 -16.24 43.42 2.611 0.853 +VM21_1 -30.31 37.55 -7.35 1.477 0.738 -2.215 -30.31 -7.35 0.738 -1.477 11.53 -16.24 43.42 2.611 0.853 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vm_32.txt b/tests/test_files/Tandem3T_iv3t_vm_32.txt new file mode 100644 index 0000000..f3d25d9 --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vm_32.txt @@ -0,0 +1,26 @@ +VM32: +{'name': 'VM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (43,)} +sizes(43, 43) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM32_0 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 +VM32_0 -14.00 0.05 14.00 0.158 0.105 -0.264 -14.00 14.00 0.105 -0.158 3.69 -19.80 0.03 0.298 0.122 +VM32_0 -14.00 0.04 14.00 0.316 0.211 -0.527 -14.00 14.00 0.211 -0.316 7.38 -19.80 0.02 0.597 0.244 +VM32_0 -14.00 0.05 14.00 0.475 0.316 -0.791 -14.00 14.00 0.316 -0.475 11.08 -19.80 0.03 0.895 0.365 +VM32_0 -14.00 0.05 14.00 0.633 0.422 -1.055 -14.00 14.00 0.422 -0.633 14.77 -19.80 0.03 1.194 0.487 +VM32_0 -14.00 0.05 14.00 0.791 0.527 -1.319 -14.00 14.00 0.527 -0.791 18.46 -19.80 0.03 1.492 0.609 +VM32_0 -14.00 0.04 14.00 0.949 0.633 -1.582 -14.00 14.00 0.633 -0.949 22.15 -19.80 0.02 1.790 0.731 +VM32_0 -13.98 -0.06 13.98 1.108 0.738 -1.846 -13.98 13.98 0.738 -1.108 25.81 -19.77 -0.04 2.089 0.853 +VM32_1 -13.98 -0.06 13.98 1.108 0.738 -1.846 -13.98 13.98 0.738 -1.108 25.81 -19.77 -0.04 2.089 0.853 +VM32_1 -13.96 -0.01 13.97 1.139 0.760 -1.899 -13.96 13.97 0.760 -1.139 26.52 -19.75 -0.01 2.148 0.877 + + +VM32_3 -13.77 0.62 13.09 1.310 0.874 -2.184 -13.77 13.09 0.874 -1.310 29.18 -18.99 0.75 2.471 1.009 +VM32_2 -13.76 0.75 12.97 1.317 0.878 -2.194 -13.76 12.97 0.878 -1.317 29.16 -18.90 0.89 2.483 1.014 +VM32_2 -13.77 0.89 12.82 1.323 0.882 -2.205 -13.77 12.82 0.882 -1.323 29.11 -18.80 1.06 2.495 1.018 +VM32_1 -13.78 1.07 12.66 1.329 0.886 -2.215 -13.78 12.66 0.886 -1.329 29.03 -18.69 1.26 2.507 1.023 +VM32_2 -13.78 1.07 12.66 1.329 0.886 -2.215 -13.78 12.66 0.886 -1.329 29.03 -18.69 1.26 2.507 1.023 +VM32_1 -14.00 2.57 11.38 1.361 0.907 -2.268 -14.00 11.38 0.907 -1.361 28.19 -17.95 3.00 2.566 1.048 +VM32_1 -14.92 5.99 8.87 1.393 0.928 -2.321 -14.92 8.87 0.928 -1.393 26.21 -16.83 6.95 2.626 1.072 +VM32_0 -17.32 12.93 4.31 1.424 0.949 -2.374 -17.32 4.31 0.949 -1.424 22.58 -15.29 14.98 2.686 1.096 +VM32_1 -17.32 12.93 4.31 1.424 0.949 -2.374 -17.32 4.31 0.949 -1.424 22.58 -15.29 14.98 2.686 1.096 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vmpp_11.txt b/tests/test_files/Tandem3T_iv3t_vmpp_11.txt new file mode 100644 index 0000000..07c4445 --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vmpp_11.txt @@ -0,0 +1,6 @@ +MPPVM11: +{'name': 'MPPVM11', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -12.65 -1.30 14.00 0.943 0.943 -1.885 -12.65 14.00 0.943 -0.943 25.12 -18.84 -1.53 2.000 1.088 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vmpp_21.txt b/tests/test_files/Tandem3T_iv3t_vmpp_21.txt new file mode 100644 index 0000000..3a529ad --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vmpp_21.txt @@ -0,0 +1,6 @@ +MPPVM21: +{'name': 'MPPVM21', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -14.09 0.87 13.17 1.307 0.653 -1.960 -14.09 13.17 0.653 -1.307 26.40 -19.27 1.03 2.310 0.754 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_iv3t_vmpp_32.txt b/tests/test_files/Tandem3T_iv3t_vmpp_32.txt new file mode 100644 index 0000000..584587b --- /dev/null +++ b/tests/test_files/Tandem3T_iv3t_vmpp_32.txt @@ -0,0 +1,6 @@ +MPPVM32: +{'name': 'MPPVM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -13.77 0.52 13.20 1.304 0.869 -2.173 -13.77 13.20 0.869 -1.304 29.19 -19.08 0.63 2.459 1.004 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_specialpoints.txt b/tests/test_files/Tandem3T_specialpoints.txt new file mode 100644 index 0000000..690df6b --- /dev/null +++ b/tests/test_files/Tandem3T_specialpoints.txt @@ -0,0 +1,11 @@ +Tandem3T SpecialPoints: +{'name': 'Tandem3T SpecialPoints', 'meastype': 'CZ', 'area': 1.0, 'shape': (6,)} +sizes(6, 6) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + Voc3 0.00 0.00 0.00 1.425 1.055 -2.480 0.00 0.00 1.055 -1.425 0.00 0.00 0.00 2.761 1.218 + Isc3 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 + VrzIto -23.23 23.23 0.00 1.448 0.000 -1.448 -23.23 0.00 0.000 -1.448 0.00 -16.42 26.82 2.048 0.000 + VztIro 0.00 -14.00 14.00 0.000 1.051 -1.051 0.00 14.00 1.051 0.000 0.00 -9.90 -16.17 0.743 1.214 + VtrIzo -14.00 0.00 14.00 0.460 0.084 -0.545 -14.00 14.00 0.084 -0.460 7.63 -19.80 0.00 0.711 0.097 + MPP -13.30 -0.18 13.53 1.277 0.912 -2.190 -13.30 13.53 0.912 -1.277 29.42 -18.97 -0.24 2.451 1.053 \ No newline at end of file diff --git a/tests/test_files/Tandem3T_str.txt b/tests/test_files/Tandem3T_str.txt new file mode 100644 index 0000000..24022bf --- /dev/null +++ b/tests/test_files/Tandem3T_str.txt @@ -0,0 +1,24 @@ +Tandem3T: +T = 25.0 C, Rz= 1 Ω cm2, Rt= 0 Ω cm2, Rr = 0 Ω cm2 + +top: +Eg = 1.80 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 0, gamma = 0 + n J0ratio J0(A/cm2) + db 1 5.082e-28 + 1.00 10.00 5.082e-27 + 2.00 10.00 7.129e-15 + +bot: +Eg = 1.40 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = 1, beta = 15, gamma = 0 + n J0ratio J0(A/cm2) + db 1 1.789e-21 + 1.00 10.00 1.789e-20 + 2.00 10.00 1.338e-11 \ No newline at end of file diff --git a/tests/test_files/iv3t_box.txt b/tests/test_files/iv3t_box.txt new file mode 100644 index 0000000..94b720b --- /dev/null +++ b/tests/test_files/iv3t_box.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (55, 55), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(3025, 3025) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) nan nan nan nan nan nan -25.00 -30.00 nan nan nan nan nan nan nan + (0, 1) nan nan nan nan nan nan -24.07 -30.00 nan nan nan nan nan nan nan + (0, 2) nan nan nan nan nan nan -23.15 -30.00 nan nan nan nan nan nan nan + (0, 3) nan nan nan nan nan nan -22.22 -30.00 nan nan nan nan nan nan nan + (0, 4) nan nan nan nan nan nan -21.30 -30.00 nan nan nan nan nan nan nan + (0, 5) nan nan nan nan nan nan -20.37 -30.00 nan nan nan nan nan nan nan + (0, 6) nan nan nan nan nan nan -19.44 -30.00 nan nan nan nan nan nan nan + (0, 7) nan nan nan nan nan nan -18.52 -30.00 nan nan nan nan nan nan nan + (0, 8) nan nan nan nan nan nan -17.59 -30.00 nan nan nan nan nan nan nan + (0, 9) nan nan nan nan nan nan -16.67 -30.00 nan nan nan nan nan nan nan + + +(54, 46) nan nan nan nan nan nan 17.59 30.00 nan nan nan nan nan nan nan +(54, 47) nan nan nan nan nan nan 18.52 30.00 nan nan nan nan nan nan nan +(54, 48) nan nan nan nan nan nan 19.44 30.00 nan nan nan nan nan nan nan +(54, 49) nan nan nan nan nan nan 20.37 30.00 nan nan nan nan nan nan nan +(54, 50) nan nan nan nan nan nan 21.30 30.00 nan nan nan nan nan nan nan +(54, 51) nan nan nan nan nan nan 22.22 30.00 nan nan nan nan nan nan nan +(54, 52) nan nan nan nan nan nan 23.15 30.00 nan nan nan nan nan nan nan +(54, 53) nan nan nan nan nan nan 24.07 30.00 nan nan nan nan nan nan nan +(54, 54) nan nan nan nan nan nan 25.00 30.00 nan nan nan nan nan nan nan \ No newline at end of file diff --git a/tests/test_files/iv3t_calc.txt b/tests/test_files/iv3t_calc.txt new file mode 100644 index 0000000..2b492db --- /dev/null +++ b/tests/test_files/iv3t_calc.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (20,), 'xkey': 'Vzt', 'ykey': 'Vrz', 'x': (0.0, 1.5), 'y': (0.0, 0.0)} +sizes(20, 20) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + MPP -14.00 0.00 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.00 0.000 0.000 + MPP -14.00 0.00 14.00 0.079 0.000 -0.079 -14.00 14.00 0.000 -0.079 1.11 -19.80 45.58 0.112 0.000 + MPP -14.00 0.00 14.00 0.158 0.000 -0.158 -14.00 14.00 0.000 -0.158 2.21 -19.80 91.16 0.223 0.000 + MPP -14.00 0.00 14.00 0.237 0.000 -0.237 -14.00 14.00 0.000 -0.237 3.32 -19.80 136.74 0.335 0.000 + MPP -14.00 0.00 14.00 0.316 0.000 -0.316 -14.00 14.00 0.000 -0.316 4.42 -19.80 182.32 0.447 0.000 + MPP -14.00 0.00 14.00 0.474 0.000 -0.474 -14.00 14.00 0.000 -0.474 6.63 -19.80 273.48 0.670 0.000 + MPP -14.00 0.00 14.00 0.553 0.000 -0.553 -14.00 14.00 0.000 -0.553 7.74 -19.80 319.06 0.782 0.000 + MPP -14.00 0.00 14.00 0.632 0.000 -0.632 -14.00 14.00 0.000 -0.632 8.84 -19.80 364.64 0.893 0.000 + MPP -14.00 0.00 14.00 0.711 0.000 -0.711 -14.00 14.00 0.000 -0.711 9.95 -19.80 410.22 1.005 0.000 + MPP -14.00 0.00 14.00 0.789 0.000 -0.789 -14.00 14.00 0.000 -0.789 11.05 -19.80 455.80 1.116 0.000 + + + MPP -14.00 0.00 14.00 0.947 0.000 -0.947 -14.00 14.00 0.000 -0.947 13.26 -19.80 546.96 1.340 0.000 + MPP -14.00 0.00 14.00 1.026 0.000 -1.026 -14.00 14.00 0.000 -1.026 14.36 -19.80 592.55 1.451 0.000 + MPP -14.00 0.02 13.98 1.105 0.000 -1.105 -14.00 13.98 0.000 -1.105 15.46 -19.79 638.13 1.563 0.000 + MPP -14.00 0.07 13.93 1.184 0.000 -1.184 -14.00 13.93 0.000 -1.184 16.49 -19.75 683.75 1.675 0.000 + MPP -14.02 0.37 13.65 1.263 0.000 -1.263 -14.02 13.65 0.000 -1.263 17.24 -19.56 729.50 1.786 0.000 + MPP -14.37 2.19 12.18 1.342 0.000 -1.342 -14.37 12.18 0.000 -1.342 16.35 -18.78 776.13 1.898 0.000 + MPP -22.00 20.63 1.37 1.421 0.000 -1.421 -22.00 1.37 0.000 -1.421 1.94 -16.52 832.36 2.010 0.000 + MPP -186.74 321.84 -135.10 1.500 0.000 -1.500 -186.74 -135.10 0.000 -1.500 -202.65 -36.52 1051.84 2.121 0.000 + MPP -14.02 0.31 13.65 1.263 0.000 -1.263 -14.02 13.65 0.000 -1.263 17.25 -19.57 0.39 1.786 0.000 \ No newline at end of file diff --git a/tests/test_files/iv3t_line.txt b/tests/test_files/iv3t_line.txt new file mode 100644 index 0000000..dc1b02f --- /dev/null +++ b/tests/test_files/iv3t_line.txt @@ -0,0 +1,16 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (11,), 'xkey': 'Vzt', 'ykey': 'Vrz', 'x': (0.0, 1.2), 'y': (0.0, 0.0)} +sizes(11, 11) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0,) nan nan nan 0.000 0.000 0.000 nan nan nan nan nan nan nan nan nan + (1,) nan nan nan 0.120 0.000 -0.120 nan nan nan nan nan nan nan nan nan + (2,) nan nan nan 0.240 0.000 -0.240 nan nan nan nan nan nan nan nan nan + (3,) nan nan nan 0.360 0.000 -0.360 nan nan nan nan nan nan nan nan nan + (4,) nan nan nan 0.480 0.000 -0.480 nan nan nan nan nan nan nan nan nan + (5,) nan nan nan 0.600 0.000 -0.600 nan nan nan nan nan nan nan nan nan + (6,) nan nan nan 0.720 0.000 -0.720 nan nan nan nan nan nan nan nan nan + (7,) nan nan nan 0.840 0.000 -0.840 nan nan nan nan nan nan nan nan nan + (8,) nan nan nan 0.960 0.000 -0.960 nan nan nan nan nan nan nan nan nan + (9,) nan nan nan 1.080 0.000 -1.080 nan nan nan nan nan nan nan nan nan +(10,) nan nan nan 1.200 0.000 -1.200 nan nan nan nan nan nan nan nan nan \ No newline at end of file diff --git a/tests/test_files/iv3t_mpp.txt b/tests/test_files/iv3t_mpp.txt new file mode 100644 index 0000000..d1dd4e6 --- /dev/null +++ b/tests/test_files/iv3t_mpp.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (55, 55), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(3025, 3025) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -25.00 55.00 -30.00 1.518 1.009 -2.527 -25.00 -30.00 1.009 -1.518 -20.33 3.54 63.51 2.860 1.165 + (0, 1) -24.07 54.07 -30.00 1.517 1.011 -2.528 -24.07 -30.00 1.011 -1.517 -21.19 4.19 62.44 2.860 1.167 + (0, 2) -23.15 53.15 -30.00 1.516 1.012 -2.529 -23.15 -30.00 1.012 -1.516 -22.05 4.84 61.37 2.860 1.169 + (0, 3) -22.22 52.22 -30.00 1.515 1.014 -2.530 -22.22 -30.00 1.014 -1.515 -22.92 5.50 60.30 2.860 1.171 + (0, 4) -21.30 51.30 -30.00 1.514 1.016 -2.531 -21.30 -30.00 1.016 -1.514 -23.79 6.15 59.23 2.860 1.173 + (0, 5) -20.37 50.37 -30.00 1.514 1.018 -2.531 -20.37 -30.00 1.018 -1.514 -24.67 6.81 58.16 2.860 1.175 + (0, 6) -19.44 49.44 -30.00 1.513 1.020 -2.532 -19.44 -30.00 1.020 -1.513 -25.55 7.46 57.09 2.860 1.178 + (0, 7) -18.52 48.52 -30.00 1.512 1.021 -2.533 -18.52 -30.00 1.021 -1.512 -26.43 8.12 56.02 2.860 1.179 + (0, 8) -17.59 47.59 -30.00 1.511 1.023 -2.534 -17.59 -30.00 1.023 -1.511 -27.32 8.77 54.96 2.860 1.181 + (0, 9) -16.67 46.67 -30.00 1.510 1.025 -2.535 -16.67 -30.00 1.025 -1.510 -28.21 9.43 53.89 2.860 1.183 + + +(54, 46) 17.59 -47.59 30.00 nan 1.113 nan 17.59 30.00 nan nan -100000.00 -8.77 -54.96 nan nan +(54, 47) 18.52 -48.52 30.00 nan 1.115 nan 18.52 30.00 nan nan -100000.00 -8.12 -56.02 nan nan +(54, 48) 19.44 -49.44 30.00 nan 1.117 nan 19.44 30.00 nan nan -100000.00 -7.46 -57.09 nan nan +(54, 49) 20.37 -50.37 30.00 nan 1.118 nan 20.37 30.00 nan nan -100000.00 -6.81 -58.16 nan nan +(54, 50) 21.30 -51.30 30.00 nan 1.120 nan 21.30 30.00 nan nan -100000.00 -6.15 -59.23 nan nan +(54, 51) 22.22 -52.22 30.00 nan 1.122 nan 22.22 30.00 nan nan -100000.00 -5.50 -60.30 nan nan +(54, 52) 23.15 -53.15 30.00 nan 1.124 nan 23.15 30.00 nan nan -100000.00 -4.84 -61.37 nan nan +(54, 53) 24.07 -54.07 30.00 nan 1.125 nan 24.07 30.00 nan nan -100000.00 -4.19 -62.44 nan nan +(54, 54) 25.00 -55.00 30.00 nan 1.127 nan 25.00 30.00 nan nan -100000.00 -3.54 -63.51 nan nan \ No newline at end of file diff --git a/tests/test_files/iv3t_resize.txt b/tests/test_files/iv3t_resize.txt new file mode 100644 index 0000000..02a01a4 --- /dev/null +++ b/tests/test_files/iv3t_resize.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (5, 10), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(50, 50) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) -25.00 55.00 -30.00 1.518 1.009 -2.527 -25.00 -30.00 1.009 -1.518 -20.33 3.54 63.51 2.860 1.165 + (0, 1) -24.07 54.07 -30.00 1.517 1.011 -2.528 -24.07 -30.00 1.011 -1.517 -21.19 4.19 62.44 2.860 1.167 + (0, 2) -23.15 53.15 -30.00 1.516 1.012 -2.529 -23.15 -30.00 1.012 -1.516 -22.05 4.84 61.37 2.860 1.169 + (0, 3) -22.22 52.22 -30.00 1.515 1.014 -2.530 -22.22 -30.00 1.014 -1.515 -22.92 5.50 60.30 2.860 1.171 + (0, 4) -21.30 51.30 -30.00 1.514 1.016 -2.531 -21.30 -30.00 1.016 -1.514 -23.79 6.15 59.23 2.860 1.173 + (0, 5) -20.37 50.37 -30.00 1.514 1.018 -2.531 -20.37 -30.00 1.018 -1.514 -24.67 6.81 58.16 2.860 1.175 + (0, 6) -19.44 49.44 -30.00 1.513 1.020 -2.532 -19.44 -30.00 1.020 -1.513 -25.55 7.46 57.09 2.860 1.178 + (0, 7) -18.52 48.52 -30.00 1.512 1.021 -2.533 -18.52 -30.00 1.021 -1.512 -26.43 8.12 56.02 2.860 1.179 + (0, 8) -17.59 47.59 -30.00 1.511 1.023 -2.534 -17.59 -30.00 1.023 -1.511 -27.32 8.77 54.96 2.860 1.181 + (0, 9) -16.67 46.67 -30.00 1.510 1.025 -2.535 -16.67 -30.00 1.025 -1.510 -28.21 9.43 53.89 2.860 1.183 + + + (4, 1) 12.96 17.04 -30.00 1.480 1.072 -2.553 12.96 -30.00 1.072 -1.480 -58.31 30.38 19.67 2.852 1.238 + (4, 2) 13.89 16.11 -30.00 1.479 1.074 -2.553 13.89 -30.00 1.074 -1.479 -59.29 31.03 18.60 2.851 1.240 + (4, 3) 14.81 15.19 -30.00 1.478 1.075 -2.553 14.81 -30.00 1.075 -1.478 -60.28 31.69 17.53 2.851 1.241 + (4, 4) 15.74 14.26 -30.00 1.477 1.076 -2.554 15.74 -30.00 1.076 -1.477 -61.27 32.34 16.47 2.850 1.243 + (4, 5) 16.67 13.33 -30.00 1.476 1.078 -2.554 16.67 -30.00 1.078 -1.476 -62.26 33.00 15.40 2.850 1.244 + (4, 6) 17.59 12.41 -30.00 1.476 1.079 -2.555 17.59 -30.00 1.079 -1.476 -63.25 33.65 14.33 2.850 1.246 + (4, 7) 18.52 11.48 -30.00 1.475 1.080 -2.555 18.52 -30.00 1.080 -1.475 -64.24 34.31 13.26 2.849 1.247 + (4, 8) 19.44 10.56 -30.00 1.474 1.082 -2.555 19.44 -30.00 1.082 -1.474 -65.24 34.96 12.19 2.849 1.249 + (4, 9) 20.37 9.63 -30.00 1.473 1.083 -2.556 20.37 -30.00 1.083 -1.473 -66.24 35.62 11.12 2.849 1.250 \ No newline at end of file diff --git a/tests/test_files/iv3t_setter.txt b/tests/test_files/iv3t_setter.txt new file mode 100644 index 0000000..31b37e1 --- /dev/null +++ b/tests/test_files/iv3t_setter.txt @@ -0,0 +1,26 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (55, 55), 'xkey': 'IA', 'ykey': 'IB', 'x': (-0.025, 0.025), 'y': (-0.03, 0.03)} +sizes(3025, 3025) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + (0, 0) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 1) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 2) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 3) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 4) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 5) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 6) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 7) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 8) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + (0, 9) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 + + +(54, 46) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 47) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 48) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 49) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 50) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 51) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 52) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 53) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 +(54, 54) 1000.00 1000.00 1000.00 1.000 1.000 1.000 1000.00 1000.00 1.000 1.000 1000.00 1000.00 1000.00 1.000 1.000 \ No newline at end of file diff --git a/tests/test_files/iv3t_str.txt b/tests/test_files/iv3t_str.txt new file mode 100644 index 0000000..1be4998 --- /dev/null +++ b/tests/test_files/iv3t_str.txt @@ -0,0 +1,5 @@ +iv3T: +{'name': 'iv3T', 'meastype': 'CZ', 'area': 1, 'shape': (0,)} +sizes(0, 0) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex \ No newline at end of file diff --git a/tests/test_files/oldpvc_Multi2T.txt b/tests/test_files/oldpvc_Multi2T.txt new file mode 100644 index 0000000..99db181 --- /dev/null +++ b/tests/test_files/oldpvc_Multi2T.txt @@ -0,0 +1,24 @@ +Multi2T: +T = 25.0 C, Rs2T= 0 Ω cm2 + +j[0]: +Eg = 1.80 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 0, gamma = 0 + n J0ratio J0(A/cm2) + db 1 5.082e-28 + 1.00 10.00 5.082e-27 + 2.00 10.00 7.129e-15 + +j[1]: +Eg = 1.40 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 15, gamma = 0 + n J0ratio J0(A/cm2) + db 1 1.789e-21 + 1.00 10.00 1.789e-20 + 2.00 10.00 1.338e-11 \ No newline at end of file diff --git a/tests/test_files/oldpvc_Multi2T_IV.csv b/tests/test_files/oldpvc_Multi2T_IV.csv new file mode 100644 index 0000000..80c58a0 --- /dev/null +++ b/tests/test_files/oldpvc_Multi2T_IV.csv @@ -0,0 +1,58 @@ +,v,i +0,-0.2,-0.013999999944439746 +1,-0.14531185125389465,-0.013999999944439746 +2,-0.09062370250778928,-0.013999999944439746 +3,-0.03593555376168392,-0.013999999944439746 +4,0.018752594984421445,-0.013999999944439746 +5,0.07344074373052684,-0.013999999944439746 +6,0.12812889247663217,-0.013999999944439746 +7,0.1828170412227375,-0.013999999944439746 +8,0.2375051899688429,-0.013999999944439746 +9,0.2921933387149483,-0.013999999944439746 +10,0.3468814874610537,-0.013999999944439746 +11,0.40156963620715896,-0.013999999944439746 +12,0.45625778495326436,-0.013999999944439746 +13,0.5109459336993698,-0.013999999944439746 +14,0.5656340824454751,-0.013999999712185964 +15,0.6203222311915804,-0.013999999712185964 +16,0.6750103799376859,-0.013999999712185964 +17,0.7296985286837911,-0.013999999479932182 +18,0.7843866774298967,-0.0139999992476784 +19,0.8390748261760019,-0.013999998783170835 +20,0.8937629749221074,-0.013999998086409489 +21,0.9484511236682127,-0.013999996692886797 +22,1.003139272414318,-0.01399999460260276 +23,1.0578274211604235,-0.013999990654288466 +24,1.1125155699065288,-0.01399998438343635 +25,1.167203718652634,-0.013999973467508598 +26,1.2218918673987396,-0.01399995488720604 +27,1.2765800161448448,-0.01399992330069169 +28,1.3312681648909501,-0.013999869417814267 +29,1.3859563136370556,-0.01399977790982416 +30,1.440644462383161,-0.013999621835282665 +31,1.4953326111292664,-0.013999355904702285 +32,1.5500207598753717,-0.01399890393884253 +33,1.604708908621477,-0.01399813332079388 +34,1.6593970573675825,-0.01399682131917942 +35,1.7140852061136878,-0.013994587037796671 +36,1.7687733548597933,-0.013990786669161962 +37,1.8234615036058985,-0.013984307485405766 +38,1.8781496523520038,-0.0139732807725982 +39,1.932837801098109,-0.01395449120938138 +40,1.9875259498442148,-0.013922425787732201 +41,2.04221409859032,-0.013867761144080212 +42,2.096902247336425,-0.01377422581071293 +43,2.1515903960825304,-0.013613674577567398 +44,2.2062785448286357,-0.013335984523698451 +45,2.260966693574741,-0.012848680321999805 +46,2.304076106752528,-0.012204081681410017 +47,2.3156548423208467,-0.011971357221533826 +48,2.370342991066952,-0.010324369938705766 +49,2.414967275732417,-0.007836734743768392 +50,2.4250311398130573,-0.0070403825179290265 +51,2.4581068684430427,-0.003469387806126767 +52,2.4797192885591626,0.0 +53,2.484365843666594,0.0008979591315148583 +54,2.503067984014319,0.0052653060691564835 +55,2.5175074131493362,0.009632653006798109 +56,2.5291909222897786,0.013999999944439746 diff --git a/tests/test_files/oldpvc_Multi2T_MPP.txt b/tests/test_files/oldpvc_Multi2T_MPP.txt new file mode 100644 index 0000000..c624de9 --- /dev/null +++ b/tests/test_files/oldpvc_Multi2T_MPP.txt @@ -0,0 +1,6 @@ +Voc:2.4797192885591626 +Isc:0.013999999944439746 +Vmp:2.1991202732372432 +Imp:0.013381759946893288 +Pmp:0.029428099590807163 +FF:0.847679465844884 diff --git a/tests/test_files/oldpvc_Tandem3T.txt b/tests/test_files/oldpvc_Tandem3T.txt new file mode 100644 index 0000000..24022bf --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T.txt @@ -0,0 +1,24 @@ +Tandem3T: +T = 25.0 C, Rz= 1 Ω cm2, Rt= 0 Ω cm2, Rr = 0 Ω cm2 + +top: +Eg = 1.80 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 0, gamma = 0 + n J0ratio J0(A/cm2) + db 1 5.082e-28 + 1.00 10.00 5.082e-27 + 2.00 10.00 7.129e-15 + +bot: +Eg = 1.40 eV, TC = 25.0 C +Jext = 14.0 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 0 S/cm2, Rser = 0 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = 1, beta = 15, gamma = 0 + n J0ratio J0(A/cm2) + db 1 1.789e-21 + 1.00 10.00 1.789e-20 + 2.00 10.00 1.338e-11 \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_CM.txt b/tests/test_files/oldpvc_Tandem3T_CM.txt new file mode 100644 index 0000000..5885561 --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_CM.txt @@ -0,0 +1,31 @@ +(CM: +{'name': 'CM', 'meastype': 'CZ', 'area': 1.0, 'shape': (42,)} +sizes(42, 42) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex + CM_0 0.00 0.00 0.00 1.425 1.055 -2.480 0.00 0.00 1.055 -1.425 0.00 0.00 0.00 2.761 1.218 + CM_0 -1.40 0.00 1.40 1.421 1.051 -2.472 -1.40 1.40 1.051 -1.421 3.46 -1.98 0.00 2.753 1.213 + CM_0 -2.80 0.00 2.80 1.417 1.046 -2.463 -2.80 2.80 1.046 -1.417 6.90 -3.96 0.00 2.743 1.208 + CM_0 -4.20 0.00 4.20 1.412 1.041 -2.452 -4.20 4.20 1.041 -1.412 10.30 -5.94 0.00 2.732 1.202 + CM_0 -5.60 0.00 5.60 1.406 1.034 -2.440 -5.60 5.60 1.034 -1.406 13.67 -7.92 0.00 2.720 1.194 + CM_0 -7.00 0.00 7.00 1.399 1.027 -2.426 -7.00 7.00 1.027 -1.399 16.98 -9.90 0.00 2.704 1.185 + CM_0 -8.40 0.00 8.40 1.390 1.017 -2.407 -8.40 8.40 1.017 -1.390 20.22 -11.88 0.00 2.685 1.174 + CM_0 -9.80 0.00 9.80 1.378 1.004 -2.382 -9.80 9.80 1.004 -1.378 23.34 -13.86 0.00 2.659 1.159 + CM_0 -11.20 0.00 11.20 1.361 0.984 -2.346 -11.20 11.20 0.984 -1.361 26.27 -15.84 0.00 2.621 1.137 + CM_1 -11.20 0.00 11.20 1.361 0.984 -2.346 -11.20 11.20 0.984 -1.361 26.27 -15.84 0.00 2.621 1.137 + + + CM_3 -13.44 0.00 13.44 1.286 0.903 -2.189 -13.44 13.44 0.903 -1.286 29.42 -19.01 0.00 2.458 1.042 + CM_2 -13.44 0.00 13.44 1.286 0.903 -2.189 -13.44 13.44 0.903 -1.286 29.42 -19.01 0.00 2.458 1.042 + CM_1 -13.44 0.00 13.44 1.286 0.903 -2.189 -13.44 13.44 0.903 -1.286 29.42 -19.01 0.00 2.458 1.042 + CM_2 -13.50 0.00 13.50 1.281 0.897 -2.179 -13.50 13.50 0.897 -1.281 29.40 -19.09 0.00 2.446 1.036 + CM_2 -13.55 0.00 13.55 1.275 0.891 -2.167 -13.55 13.55 0.891 -1.275 29.36 -19.17 0.00 2.434 1.029 + CM_2 -13.61 0.00 13.61 1.269 0.884 -2.153 -13.61 13.61 0.884 -1.269 29.30 -19.24 0.00 2.420 1.021 + CM_2 -13.66 0.00 13.66 1.261 0.876 -2.137 -13.66 13.66 0.876 -1.261 29.21 -19.32 0.00 2.403 1.012 + CM_1 -13.72 0.00 13.72 1.252 0.867 -2.119 -13.72 13.72 0.867 -1.252 29.07 -19.40 0.00 2.384 1.001 + CM_2 -13.72 0.00 13.72 1.252 0.867 -2.119 -13.72 13.72 0.867 -1.252 29.07 -19.40 0.00 2.384 1.001 , MPPCM: +{'name': 'MPPCM', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -13.37 0.00 13.37 1.292 0.909 -2.201 -13.37 13.37 0.909 -1.292 29.43 -18.91 0.00 2.470 1.049 ) \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_MPP.txt b/tests/test_files/oldpvc_Tandem3T_MPP.txt new file mode 100644 index 0000000..0264f91 --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_MPP.txt @@ -0,0 +1,6 @@ +MPP: +{'name': 'MPP', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -13.30 -0.18 13.53 1.277 0.912 -2.190 -13.30 13.53 0.912 -1.277 29.42 -18.97 -0.24 2.451 1.053 \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_VM21.txt b/tests/test_files/oldpvc_Tandem3T_VM21.txt new file mode 100644 index 0000000..0ab6b94 --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_VM21.txt @@ -0,0 +1,31 @@ +(VM21: +{'name': 'VM21', 'meastype': 'CZ', 'area': 1.0, 'shape': (41,)} +sizes(41, 41) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM21_0 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 +VM21_0 -14.00 0.05 14.00 0.211 0.105 -0.316 -14.00 14.00 0.105 -0.211 4.43 -19.80 0.03 0.373 0.122 +VM21_0 -14.00 0.04 14.00 0.422 0.211 -0.633 -14.00 14.00 0.211 -0.422 8.86 -19.80 0.03 0.746 0.244 +VM21_0 -14.00 0.01 14.00 0.633 0.316 -0.949 -14.00 14.00 0.316 -0.633 13.29 -19.80 0.01 1.119 0.365 +VM21_0 -14.00 -0.05 14.00 0.844 0.422 -1.266 -14.00 14.00 0.422 -0.844 17.72 -19.80 -0.03 1.492 0.487 +VM21_0 -14.00 -0.04 13.99 1.055 0.527 -1.582 -14.00 13.99 0.527 -1.055 22.15 -19.79 -0.02 1.865 0.609 +VM21_1 -14.00 -0.04 13.99 1.055 0.527 -1.582 -14.00 13.99 0.527 -1.055 22.15 -19.79 -0.02 1.865 0.609 +VM21_1 -14.00 -0.04 13.99 1.097 0.549 -1.646 -14.00 13.99 0.549 -1.097 23.03 -19.79 -0.01 1.940 0.633 +VM21_1 -14.00 -0.02 13.97 1.139 0.570 -1.709 -14.00 13.97 0.570 -1.139 23.89 -19.78 0.01 2.014 0.658 +VM21_1 -14.00 0.02 13.93 1.182 0.591 -1.772 -14.00 13.93 0.591 -1.182 24.73 -19.75 0.05 2.089 0.682 + + +VM21_2 -14.18 1.34 12.78 1.325 0.663 -1.988 -14.18 12.78 0.663 -1.325 26.33 -19.06 1.58 2.342 0.765 +VM21_2 -14.24 1.64 12.55 1.334 0.667 -2.000 -14.24 12.55 0.667 -1.334 26.23 -18.94 1.93 2.357 0.770 +VM21_2 -14.33 2.02 12.27 1.342 0.671 -2.013 -14.33 12.27 0.671 -1.342 26.08 -18.81 2.36 2.372 0.775 +VM21_1 -14.46 2.48 11.93 1.350 0.675 -2.026 -14.46 11.93 0.675 -1.350 25.87 -18.66 2.89 2.387 0.780 +VM21_2 -14.46 2.48 11.93 1.350 0.675 -2.026 -14.46 11.93 0.675 -1.350 25.87 -18.66 2.89 2.387 0.780 +VM21_1 -16.00 6.95 8.99 1.393 0.696 -2.089 -16.00 8.99 0.696 -1.393 23.66 -17.67 8.06 2.462 0.804 +VM21_1 -20.74 18.04 2.78 1.435 0.717 -2.152 -20.74 2.78 0.717 -1.435 18.86 -16.63 20.79 2.536 0.828 +VM21_0 -30.31 37.55 -7.35 1.477 0.738 -2.215 -30.31 -7.35 0.738 -1.477 11.53 -16.24 43.42 2.611 0.853 +VM21_1 -30.31 37.55 -7.35 1.477 0.738 -2.215 -30.31 -7.35 0.738 -1.477 11.53 -16.24 43.42 2.611 0.853 , MPPVM21: +{'name': 'MPPVM21', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -14.09 0.87 13.17 1.307 0.653 -1.960 -14.09 13.17 0.653 -1.307 26.40 -19.27 1.03 2.310 0.754 ) \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_VM32.txt b/tests/test_files/oldpvc_Tandem3T_VM32.txt new file mode 100644 index 0000000..538d151 --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_VM32.txt @@ -0,0 +1,31 @@ +(VM32: +{'name': 'VM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (43,)} +sizes(43, 43) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM32_0 -14.00 0.05 14.00 0.000 0.000 0.000 -14.00 14.00 0.000 0.000 0.00 -19.80 0.03 0.000 0.000 +VM32_0 -14.00 0.05 14.00 0.158 0.105 -0.264 -14.00 14.00 0.105 -0.158 3.69 -19.80 0.03 0.298 0.122 +VM32_0 -14.00 0.04 14.00 0.316 0.211 -0.527 -14.00 14.00 0.211 -0.316 7.38 -19.80 0.02 0.597 0.244 +VM32_0 -14.00 0.05 14.00 0.475 0.316 -0.791 -14.00 14.00 0.316 -0.475 11.08 -19.80 0.03 0.895 0.365 +VM32_0 -14.00 0.05 14.00 0.633 0.422 -1.055 -14.00 14.00 0.422 -0.633 14.77 -19.80 0.03 1.194 0.487 +VM32_0 -14.00 0.05 14.00 0.791 0.527 -1.319 -14.00 14.00 0.527 -0.791 18.46 -19.80 0.03 1.492 0.609 +VM32_0 -14.00 0.04 14.00 0.949 0.633 -1.582 -14.00 14.00 0.633 -0.949 22.15 -19.80 0.02 1.790 0.731 +VM32_0 -13.98 -0.06 13.98 1.108 0.738 -1.846 -13.98 13.98 0.738 -1.108 25.81 -19.77 -0.04 2.089 0.853 +VM32_1 -13.98 -0.06 13.98 1.108 0.738 -1.846 -13.98 13.98 0.738 -1.108 25.81 -19.77 -0.04 2.089 0.853 +VM32_1 -13.96 -0.01 13.97 1.139 0.760 -1.899 -13.96 13.97 0.760 -1.139 26.52 -19.75 -0.01 2.148 0.877 + + +VM32_3 -13.77 0.62 13.09 1.310 0.874 -2.184 -13.77 13.09 0.874 -1.310 29.18 -18.99 0.75 2.471 1.009 +VM32_2 -13.76 0.75 12.97 1.317 0.878 -2.194 -13.76 12.97 0.878 -1.317 29.16 -18.90 0.89 2.483 1.014 +VM32_2 -13.77 0.89 12.82 1.323 0.882 -2.205 -13.77 12.82 0.882 -1.323 29.11 -18.80 1.06 2.495 1.018 +VM32_1 -13.78 1.07 12.66 1.329 0.886 -2.215 -13.78 12.66 0.886 -1.329 29.03 -18.69 1.26 2.507 1.023 +VM32_2 -13.78 1.07 12.66 1.329 0.886 -2.215 -13.78 12.66 0.886 -1.329 29.03 -18.69 1.26 2.507 1.023 +VM32_1 -14.00 2.57 11.38 1.361 0.907 -2.268 -14.00 11.38 0.907 -1.361 28.19 -17.95 3.00 2.566 1.048 +VM32_1 -14.92 5.99 8.87 1.393 0.928 -2.321 -14.92 8.87 0.928 -1.393 26.21 -16.83 6.95 2.626 1.072 +VM32_0 -17.32 12.93 4.31 1.424 0.949 -2.374 -17.32 4.31 0.949 -1.424 22.58 -15.29 14.98 2.686 1.096 +VM32_1 -17.32 12.93 4.31 1.424 0.949 -2.374 -17.32 4.31 0.949 -1.424 22.58 -15.29 14.98 2.686 1.096 , MPPVM32: +{'name': 'MPPVM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -13.77 0.52 13.20 1.304 0.869 -2.173 -13.77 13.20 0.869 -1.304 29.19 -19.08 0.63 2.459 1.004 ) \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_VM32_set.txt b/tests/test_files/oldpvc_Tandem3T_VM32_set.txt new file mode 100644 index 0000000..0aeab74 --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_VM32_set.txt @@ -0,0 +1,31 @@ +(VM32: +{'name': 'VM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (43,)} +sizes(43, 43) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +VM32_0 -11.39 -1.66 13.10 0.000 0.000 0.000 -11.39 13.10 0.000 0.000 0.00 -17.32 -1.94 0.000 0.000 +VM32_0 -11.39 -1.66 13.10 0.156 0.104 -0.261 -11.39 13.10 0.104 -0.156 3.24 -17.32 -1.95 0.295 0.120 +VM32_0 -11.38 -1.67 13.10 0.313 0.209 -0.522 -11.38 13.10 0.209 -0.313 6.47 -17.31 -1.95 0.590 0.241 +VM32_0 -11.38 -1.67 13.10 0.469 0.313 -0.782 -11.38 13.10 0.313 -0.469 9.71 -17.31 -1.96 0.885 0.361 +VM32_0 -11.37 -1.68 13.10 0.626 0.417 -1.043 -11.37 13.10 0.417 -0.626 12.95 -17.31 -1.96 1.180 0.482 +VM32_0 -11.37 -1.68 13.10 0.782 0.522 -1.304 -11.37 13.10 0.522 -0.782 16.18 -17.30 -1.97 1.475 0.602 +VM32_0 -11.36 -1.69 13.10 0.939 0.626 -1.565 -11.36 13.10 0.626 -0.939 19.41 -17.30 -1.98 1.770 0.723 +VM32_0 -11.34 -1.70 13.09 1.095 0.730 -1.826 -11.34 13.09 0.730 -1.095 22.62 -17.28 -1.99 2.065 0.843 +VM32_1 -11.34 -1.70 13.09 1.095 0.730 -1.826 -11.34 13.09 0.730 -1.095 22.62 -17.28 -1.99 2.065 0.843 +VM32_1 -11.33 -1.71 13.09 1.127 0.751 -1.878 -11.33 13.09 0.751 -1.127 23.25 -17.26 -2.00 2.125 0.867 + + +VM32_3 -11.00 -1.45 12.39 1.321 0.880 -2.201 -11.00 12.39 0.880 -1.321 26.05 -16.54 -1.64 2.490 1.017 +VM32_2 -10.97 -1.38 12.29 1.327 0.885 -2.212 -10.97 12.29 0.885 -1.327 26.01 -16.45 -1.56 2.502 1.022 +VM32_2 -10.93 -1.30 12.18 1.333 0.889 -2.222 -10.93 12.18 0.889 -1.333 25.95 -16.34 -1.47 2.514 1.026 +VM32_2 -10.89 -1.15 12.05 1.340 0.893 -2.233 -10.89 12.05 0.893 -1.340 25.87 -16.22 -1.33 2.526 1.031 +VM32_1 -10.85 -1.09 11.89 1.346 0.897 -2.243 -10.85 11.89 0.897 -1.346 25.74 -16.08 -1.23 2.538 1.036 +VM32_2 -10.85 -1.09 11.89 1.346 0.897 -2.243 -10.85 11.89 0.897 -1.346 25.74 -16.08 -1.23 2.538 1.036 +VM32_1 -10.59 -0.12 10.67 1.377 0.918 -2.295 -10.59 10.67 0.918 -1.377 24.42 -15.04 -0.12 2.597 1.060 +VM32_0 -10.17 2.03 8.09 1.408 0.939 -2.347 -10.17 8.09 0.939 -1.408 20.94 -12.91 2.37 2.656 1.084 +VM32_1 -10.17 2.03 8.09 1.408 0.939 -2.347 -10.17 8.09 0.939 -1.408 20.94 -12.91 2.37 2.656 1.084 , MPPVM32: +{'name': 'MPPVM32', 'meastype': 'CZ', 'area': 1.0, 'shape': (1,)} +sizes(1, 1) + + # mIro mIzo mIto Vzt Vrz Vtr mIA mIB VA VB mPtot mIxhex mIyhex Vxhex Vyhex +(0,) -11.04 -1.53 12.51 1.312 0.875 -2.187 -11.04 12.51 0.875 -1.312 26.07 -16.65 -1.73 2.474 1.010 ) \ No newline at end of file diff --git a/tests/test_files/oldpvc_Tandem3T_to_2Tcopy.txt b/tests/test_files/oldpvc_Tandem3T_to_2Tcopy.txt new file mode 100644 index 0000000..02909de --- /dev/null +++ b/tests/test_files/oldpvc_Tandem3T_to_2Tcopy.txt @@ -0,0 +1,24 @@ +Tandem3T: +T = 25.0 C, Rs2T= 0.278 Ω cm2 + +top: +Eg = 1.87 eV, TC = 25.0 C +Jext = 13.1 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 1e-08 S/cm2, Rser = 0.1 Ωcm2 +lightA = 1 cm2, totalA = 1 cm2 +pn = -1, beta = 0, gamma = 0 + n J0ratio J0(A/cm2) + db 1 3.593e-29 + 1.00 80.00 2.875e-27 + 2.00 22.00 4.170e-15 + +bot: +Eg = 1.42 eV, TC = 25.0 C +Jext = 12.8 mA/cm2, JLC = 0.0 mA/cm2 +Gsh = 5e-05 S/cm2, Rser = 0.2 Ωcm2 +lightA = 0.89 cm2, totalA = 0.89 cm2 +pn = 1, beta = 3, gamma = 0 + n J0ratio J0(A/cm2) + db 1 8.771e-22 + 1.00 10.00 8.771e-21 + 2.00 15.00 1.405e-11 \ No newline at end of file diff --git a/tests/test_iv3t.py b/tests/test_iv3t.py new file mode 100644 index 0000000..180fefe --- /dev/null +++ b/tests/test_iv3t.py @@ -0,0 +1,202 @@ +import re +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pytest + +import pvcircuit as pvc +from pvcircuit import IV3T, Tandem3T + + +@pytest.fixture +def dev3T(): + return Tandem3T() + + +@pytest.fixture +def iv3t(): + return IV3T() + + +@pytest.fixture +def junction(): + return pvc.junction.Junction() + + +def test_iv3t_str(iv3t): + + + test_file = "iv3t_str.txt" + + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_iv3t_setter(dev3T, iv3t): + + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + iv3t.convert("I", "load2dev") + dev3T.V3T(iv3t) + for k in iv3t.arraykeys: + iv3t.set(**{k: 1}) + + test_file = "iv3t_setter.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_dev2load(dev3T,iv3t): + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + iv3t.convert("I", "load2dev") + dev3T.V3T(iv3t) + iv3t2 = iv3t.copy() + iv3t.init(["IA","IB"],["IA","IB"]) + iv3t.convert("I", "dev2load") + iv3t.__str__() == iv3t2.__str__() + + iv3t.line("Vzt", 0, 1.2, 11, "Vrz", "0") + + +def test_line(iv3t): + + iv3t.line("Vzt", 0, 1.2, 11, "Vrz", "0") + + test_file = "iv3t_line.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_box(iv3t): + + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + + test_file = "iv3t_box.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_nanpnt(iv3t): + + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + + array = getattr(iv3t,"IA") + np.testing.assert_almost_equal(array[0,0],-25e-3) + iv3t.nanpnt((0,0)) + np.testing.assert_almost_equal(array[0,0],np.nan) + + +def test_mpp(iv3t, dev3T): + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + iv3t.convert("I", "load2dev") + dev3T.V3T(iv3t) + + # mpp = iv3t.MPP() + + test_file = "iv3t_mpp.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_resize(iv3t, dev3T): + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + iv3t.convert("I", "load2dev") + dev3T.V3T(iv3t) + + iv3t.resize([5,10]) + + np.testing.assert_array_equal(iv3t.sizes(["VA"]), [50,50]) + + test_file = "iv3t_resize.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_calc(iv3t,dev3T): + + # Create voltage line range + iv3t.line("Vzt", 0, 1.5, 20, "Vrz", "0") + + # Copy for comparinson + iv3t2 = iv3t.copy() + + # Convert dev2load for voltages + iv3t.convert("V", "dev2load") + # Calculate current based on abs values + dev3T.J3Tabs(iv3t) + # convert dev2load for currents + iv3t.convert("I", "dev2load") + # Calculate power + iv3t.Pcalc() + # Check kirchhoff + iv3t.kirchhoff(iv3t.Idevlist) + # recalculate currents + iv3t.convert("I", "load2dev") + + # Calculate everything fo iv3t2 directly. Should be the same? + dev3T.I3Trel(iv3t2) + iv3t.append(iv3t2.MPP()) + + iv3t.delete(5) + + test_file = "iv3t_calc.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + +if __name__ == "__main__": + iv3t = IV3T() + dev3T = Tandem3T() + iv3t.line("Vzt", 0, 1.5, 20, "Vrz", "0") + iv3t.convert("V", "dev2load") + dev3T.J3Tabs(iv3t) + iv3t.convert("I", "dev2load") + iv3t.Pcalc() + dev3T.I3Trel(iv3t) + + + v = getattr(iv3t,"VB") + i = getattr(iv3t,"IB") + plt.plot(v,i) + plt.show() \ No newline at end of file diff --git a/tests/test_junction.py b/tests/test_junction.py new file mode 100644 index 0000000..73e532c --- /dev/null +++ b/tests/test_junction.py @@ -0,0 +1,252 @@ +import os +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from pvlib import ivtools, pvsystem + +import pvcircuit as pvc +from pvcircuit import Multi2T + +if __name__ == "__main__": + + root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + fp = os.path.join(root, "data", "Pvsk_1.70MA-free_JV.csv") + # fp = os.path.join(root,"IBC2x2.csv") + + A = 0.122 + TC = 25 # [degC] + Eg = 1.8 # [eV] + + data = pd.read_csv(fp) + # Measured terminal voltage. + voltage = data["v"].to_numpy(np.double) # [V] + # Measured terminal current. + current = data["i"].to_numpy(np.double) / 1000 * A # [A] + + sort_id = np.argsort(voltage) + + voltage = voltage[sort_id] + current = current[sort_id] + + photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth = ivtools.sde.fit_sandia_simple(voltage, current) + d_fitres = pvsystem.singlediode(photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth, ivcurve_pnts=100, method="brentq") + + fit_voltage = d_fitres["v"] + fit_current = d_fitres["i"] + + Jext = photocurrent / A # [A/cm^2] + n = nNsVth / pvc.junction.Vth(TC) + J0ref = saturation_current / A + J0scale = 1000 + Rser = resistance_series * A + Gsh = 1 / (resistance_shunt * A) + # pvc.junction.DB_PREFIX + Jdb = pvc.junction.Jdb(TC=TC, Eg=Eg) + # j0=(self.Jdb * self.J0scale)**(1./self.n) * self.J0ratio / self.J0scale + J0ratio = J0scale * J0ref / (Jdb * J0scale) ** (1.0 / n) + + PVK = Multi2T(name="Psk", area=A, Jext=Jext, Eg_list=[Eg], n=[n], J0ratio=[J0ratio]) + PVK.set(Rs2T=Rser, Gsh=Gsh) + PVK.j[0] + + MPP = PVK.MPP() + + Voc = MPP["Voc"] + Isc = MPP["Isc"] + + pvc_voltage_set = np.linspace(0, Voc) + pvc_current_set = np.linspace(0, Isc) + + pvc_voltage_calc = np.zeros_like(pvc_voltage_set) + pvc_current_calc = np.zeros_like(pvc_current_set) + + V2Tvect = np.vectorize(PVK.V2T) + I2Tvect = np.vectorize(PVK.I2T) + + pvc_current_calc = I2Tvect(pvc_voltage_set) + pvc_voltage_calc = V2Tvect(pvc_current_set) + + Vboth = np.concatenate((pvc_voltage_calc, pvc_voltage_set), axis=None) + Iboth = np.concatenate((pvc_current_set, pvc_current_calc), axis=None) + # sort + p = np.argsort(Vboth) + Vlight = Vboth[p] + Ilight = -1 * Iboth[p] + + fig, ax = plt.subplots() + ax.plot(voltage, current, ".") + ax.plot(Vlight, Ilight) + # ax.plot(Vl,Il, "--") + plt.show() + + print(pvc.junction.Vth(25)) + + +# %% +def test_basic_functions(): + + # Test thermal voltage + np.testing.assert_almost_equal(pvc.junction.Vth(25), 0.02569257912108585) + + # Test temperature conversion + np.testing.assert_almost_equal(pvc.junction.TK(25), 298.15) + + # Test detailed balance current + Eg = 1.12 + TC = 25 + EgkT = Eg / pvc.junction.Vth(TC) + np.testing.assert_almost_equal(pvc.junction.Jdb(TC=TC, Eg=Eg, sigma=0), 6.249646867228706e-17) + + # Comapre to old PV with sigma = 0 + np.testing.assert_almost_equal(pvc.junction.Jdb(TC=TC, Eg=Eg, sigma=0), pvc.junction.DB_PREFIX * pvc.junction.TK(TC) ** 3.0 * (EgkT * EgkT + 2.0 * EgkT + 2.0) * np.exp(-EgkT)) + + +# %% +@pytest.fixture +def junction(): + return pvc.junction.Junction() + + +def test_junction_str(junction): + + test_file = "Junction.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(junction.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(test_str, junction.__str__()) + +def test_junction_setter(junction): + """ + Test the junction setters. + """ + + # test setting of n + junction.set(n=[1, 2]) + np.testing.assert_array_equal(junction.n, np.array([1, 2])) + + # test setting of single n value + junction.set(**{"n[0]": 3}) + np.testing.assert_array_equal(junction.n, np.array([3, 2])) + + # test mismatch when setting single n value + with pytest.raises(IndexError, match=r"invalid junction index. Set index is 3 but junction size is 2"): + junction.set(**{"n[2]": 4}) + + # test mismatch when setting n and J0ratio of different size + with pytest.raises(ValueError, match=r"n and J0ratio must be same size"): + junction.set(n=[1, 2, 3], J0ratio=[1, 2]) + + with pytest.raises(ValueError, match=r"n and J0ratio must be same size"): + junction.set(n=[1, 2], J0ratio=[1, 2, 3]) + + # test mismatch when setting n or J0ratio with different number of current diode number + with pytest.raises(ValueError, match=r"setting single n or J0ratio value must match previous number of diodes"): + junction.set(n=[1, 2, 3]) + + with pytest.raises(ValueError, match=r"setting single n or J0ratio value must match previous number of diodes"): + junction.set(J0ratio=[1, 2, 3]) + + + # test setting the general area with light and total area + junction.set(area=1.23) + np.testing.assert_almost_equal(junction.lightarea, 1.23) + np.testing.assert_almost_equal(junction.totalarea, 1.23) + + # test setting invalid class values + with pytest.raises(ValueError, match=r"invalid class attribute test"): + junction.set(test=-1) + with pytest.raises(ValueError, match=r"invalid class attribute avalanche"): + junction.set(avalanche=1) + with pytest.raises(ValueError, match=r"invalid class attribute mrb"): + junction.set(mrb=1) + + # test reverse bias breakdown model keys + junction.set(RBB="bishop") + junction.set(avalanche=1) + + with pytest.raises(ValueError, match=r"invalid class attribute J0rb"): + junction.set(J0rb=1) + + junction.set(RBB="JFG") + junction.set(J0rb=1) + + +def test_junction_properties(junction): + """ + Test the junction properties. + """ + + np.testing.assert_almost_equal(junction.Jphoto, 0.04) + np.testing.assert_allclose(junction.J0, [1.3141250302231388e-15, 3.6250862475576206e-09]) + + +def test_junction_j0init(junction): + + with pytest.raises(ValueError, match=r"J0ref and n must be same size"): + junction._J0init(1e-15) + + junction._J0init([1e-15, 1e-9]) + + np.testing.assert_allclose(junction.J0, [1e-15, 1e-9]) + np.testing.assert_allclose(junction.J0ratio, [7.609626, 2.75855506]) + + +def test_jem(junction): + + np.testing.assert_almost_equal(junction.Jem(0.6), 1.8227873411146403e-06) + np.testing.assert_almost_equal(junction.Jem(-0.6), 0.0) + + +def test_notdiode(junction): + + assert not junction.notdiode() + junction.set(J0ratio=[0, 0]) + assert junction.notdiode() + + +def test_Jmultidiodes(junction): + + np.testing.assert_almost_equal(junction.Jmultidiodes(0.56), 0.00019985765193700707) + + +def test_JshuntRBB(junction): + + junction.set(RBB=None, Gsh=1e-4) + np.testing.assert_almost_equal(junction.JshuntRBB(2), 0.0002) + junction.set(RBB="JFG") + np.testing.assert_almost_equal(junction.JshuntRBB(-3), -3.033350517003164) + junction.set(RBB="bishop") + np.testing.assert_almost_equal(junction.JshuntRBB(-18), -0.0018153659543416658) + + +def test_Vdiode(junction): + + np.testing.assert_almost_equal(junction.Vdiode(0), 0.7849550554937345) + np.testing.assert_almost_equal(junction.Vdiode(-40e-3), 0, decimal=5) + np.testing.assert_equal(junction.Vdiode(-41e-3), np.nan) #VLIM_REVERSE + + junction.set(RBB="bishop", Gsh=1e-4) + np.testing.assert_almost_equal(junction.Vdiode(-41e-3), -9.652384228088378) + junction.set(RBB="JFG") + np.testing.assert_almost_equal(junction.Vdiode(-41e-3), -0.9224606102628319) + + junction.set(J0ratio=[0, 0]) + np.testing.assert_almost_equal(junction.Vdiode(-41e-3), 0) + + +def test_Vmid(junction): + + np.testing.assert_almost_equal(junction.Vmid(0), 0) + np.testing.assert_almost_equal(junction.Vmid(0.5), 0.5) + + junction.set(Rser=0.73) + np.testing.assert_almost_equal(junction.Vmid(0), 0.029200002624152344) + np.testing.assert_almost_equal(junction.Vmid(0.5), 0.5291205858003947) diff --git a/tests/test_multi2T.py b/tests/test_multi2T.py new file mode 100644 index 0000000..e66ea19 --- /dev/null +++ b/tests/test_multi2T.py @@ -0,0 +1,196 @@ +import os +import time +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pytest +from pvlib import ivtools, pvsystem + +import pvcircuit as pvc +from pvcircuit import Multi2T, Tandem3T + + +@pytest.fixture +def dev2T(): + return Multi2T() + + +@pytest.fixture +def dev3T(): + return Tandem3T() + + +@pytest.fixture +def junction(): + return pvc.junction.Junction() + + +def test_2Tfrom3T(dev3T): + + dev2T = Multi2T.from_3T(dev3T) + params2T = dev2T.MPP(pnts=150) + _, params3T = dev3T.CM(pnts=150) + + np.testing.assert_almost_equal(params2T["Pmp"], params3T.Ptot) + np.testing.assert_almost_equal(params2T["Imp"], params3T.Ito) + np.testing.assert_almost_equal(params2T["Vmp"], -1 * params3T.Vtr, decimal=4) + + params3T = dev3T.Voc3() + np.testing.assert_almost_equal(params2T["Voc"], -1 * params3T.Vtr) + + params3T = dev3T.Isc3() + np.testing.assert_almost_equal(params2T["Isc"], params3T.Ito) + + +def test_2T_from_single_junction(junction): + + junction.set(n=[1], J0ratio=[1e4]) + + dev2T = Multi2T.from_single_junction(junction) + params2T = dev2T.MPP(pnts=150) + pvlib_sd = pvsystem.singlediode(junction.Jext, junction.J0, junction.Rser, 1 / junction.Gsh, junction.n * junction.Vth) + + np.testing.assert_almost_equal(params2T["Pmp"], pvlib_sd.loc[0, "p_mp"], decimal=6) + np.testing.assert_almost_equal(params2T["Imp"], pvlib_sd.loc[0, "i_mp"], decimal=5) + np.testing.assert_almost_equal(params2T["Vmp"], pvlib_sd.loc[0, "v_mp"], decimal=4) + np.testing.assert_almost_equal(params2T["Isc"], pvlib_sd.loc[0, "i_sc"]) + np.testing.assert_almost_equal(params2T["Voc"], pvlib_sd.loc[0, "v_oc"]) + + +def test_multi2T_str(dev2T): + + test_file = "Multi2T_str.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(dev2T.__str__()) + + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(test_str, dev2T.__str__()) + + +def test_multi2T_setter(dev2T): + # test setter of multi2T class + + dev2T.set(n=[1, 2]) + for junction in dev2T.j: + np.testing.assert_array_equal(junction.n, np.array([1, 2])) + + dev2T.set(area=1.23) + np.testing.assert_array_equal(dev2T.lightarea, 1.23) + np.testing.assert_array_equal(dev2T.totalarea, 1.23) + for junction in dev2T.j: + np.testing.assert_array_equal(junction.lightarea, 1.23) + np.testing.assert_array_equal(junction.totalarea, 1.23) + + with pytest.raises(ValueError, match=r"invalid class attribute test"): + dev2T.set(test=-1) + with pytest.raises(ValueError, match=r"invalid class attribute avalanche"): + dev2T.set(avalanche=1) + with pytest.raises(ValueError, match=r"invalid class attribute mrb"): + dev2T.set(mrb=1) + with pytest.raises(ValueError, match=r"invalid class attribute J0rb"): + dev2T.set(J0rb=1) + + # dev2T.set(RBB="bishop") + + +def test_V2T(dev2T): + # test 2T voltage from current + np.testing.assert_almost_equal(dev2T.V2T(0), dev2T.Voc()) + # np.testing.assert_almost_equal(dev2T.V2T(dev2T.Isc()), 0) + np.testing.assert_almost_equal(dev2T.V2T(0), dev2T.j[0].Vdiode(0) + dev2T.j[1].Vdiode(0)) + + # np.testing.assert_almost_equal(dev2T.V2T(-1*dev2T.Isc()), 0) # TODO shouldn't voltage from current at Isc return 0? + np.testing.assert_almost_equal(dev2T.V2T(-1 * dev2T.proplist("Jphoto")[0]), 0, decimal=5) + + np.testing.assert_almost_equal(dev2T.V2T(-1), np.nan) # TODO consider brekdown here? + # dev2T.set(RBB="bishop", Gsh=1e-4) + + +def test_Imaxrev(dev2T): + # Maximum rev bias current? + # TODO: check behaviour and use reverse bias + + np.testing.assert_almost_equal(dev2T.Imaxrev(), max(dev2T.j[0].Jext, dev2T.j[1].Jext)) + dev2T.j[0].set(Jext=1.2) + np.testing.assert_almost_equal(dev2T.Imaxrev(), max(dev2T.j[0].Jext, dev2T.j[1].Jext)) + + +def test_I2T(dev2T): + # test 2T current from voltage + # np.testing.assert_almost_equal(dev2T.I2T(0), -1 * dev2T.Imaxrev()) + np.testing.assert_almost_equal(dev2T.I2T(dev2T.Voc()), 0) + np.testing.assert_almost_equal(dev2T.I2T(dev2T.V2T(0) * 1), 0) + + for i in np.arange(1e-6, dev2T.Voc()): + np.testing.assert_almost_equal(dev2T.I2Troot(i), dev2T.I2T(i)) + + +def test_MPP(dev2T): + # calculate maximum power point and associated IV, Vmp, Imp, FF + # res=0.001 #voltage resolution + dev2T.set(Jext=0) + np.testing.assert_equal(dev2T.MPP()["Pmp"], np.nan) + + +def test_4j(): + totalarea = 1.15 + tandem4J = pvc.Multi2T(name="4J", Eg_list=[1.83, 1.404, 1.049, 0.743], Jext=0.012, Rs2T=0.1, area=1) + tandem4J.j[0].set(Jext=0.01196, n=[1, 1.6], J0ratio=[31, 4.5], totalarea=totalarea) + tandem4J.j[1].set(Jext=0.01149, n=[1, 1.8], J0ratio=[17, 42], beta=14.3, totalarea=totalarea) + tandem4J.j[2].set(Jext=0.01135, n=[1, 1.4], J0ratio=[51, 14], beta=8.6, totalarea=totalarea) + tandem4J.j[3].set(Jext=0.01228, n=[1, 1.5], J0ratio=[173, 79], beta=10.5, totalarea=totalarea) + tandem4J.j[3].RBB_dict = {"method": "JFG", "mrb": 43.0, "J0rb": 0.3, "Vrb": 0.0} + + mpp = tandem4J.MPP() + + np.testing.assert_allclose(mpp["Voc"], 3.425330977574876, rtol=1e-5) + np.testing.assert_allclose(mpp["Voc"], 3.425330977574876, rtol=1e-5) + np.testing.assert_allclose(mpp["Isc"], 0.011350991117526023, rtol=1e-5) + np.testing.assert_allclose(mpp["Vmp"], 3.0129358068534247, rtol=1e-5) + np.testing.assert_allclose(mpp["Imp"], 0.011073118854968986, rtol=1e-5) + + +def plot_2T(): + + dev2T = Multi2T() + # dev2T.set(RBB="bishop") + # dev2T.j[0].set(Vrb=-2) + # dev2T.j[1].set(Vrb=-2) + volts = np.linspace(-1, dev2T.Voc(), 500) + currs1 = [] + currs2 = [] + + t_start = time.perf_counter() + for v in volts: + currs1.append(dev2T.I2T(v)) + t_end = time.perf_counter() + print(f"Timef or Dans {t_end-t_start}s") + + t_start = time.perf_counter() + for v in volts: + currs2.append(dev2T.I2Troot(v)) + t_end = time.perf_counter() + print(f"Timef or Dans {t_end-t_start}s") + + fig, ax = plt.subplots() + ax.plot(volts, currs1, ".", ms=1) + ax.plot(volts, currs2, "o", ms=5, mfc="None") + plt.show() + + +def i2trun(): + dev2T = Multi2T() + + dev2T.I2T(2.4) + dev2T.I2Troot(2.4) + + +if __name__ == "__main__": + + i2trun() + plot_2T() + print("done") diff --git a/tests/test_oldpvc.py b/tests/test_oldpvc.py new file mode 100644 index 0000000..b26b449 --- /dev/null +++ b/tests/test_oldpvc.py @@ -0,0 +1,147 @@ +import os +import re +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest + +from pvcircuit import Multi2T, Tandem3T + + +@pytest.fixture +def multi2T(): + return Multi2T() + + +@pytest.fixture +def tandem3T(): + return Tandem3T() + + +def test_Multi2T(multi2T): + + test_file = "oldpvc_Multi2T.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(test_str, multi2T.__str__()) + + +def test_Multi2T_MPP(multi2T): + + test_file = "oldpvc_Multi2T_MPP.txt" + + # make dict + multi2T_in = {} + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + for line in fin: + data = line.rstrip().split(":") + multi2T_in[data[0]] = float(data[1]) + + assert multi2T_in == multi2T.MPP() + np.testing.assert_equal(multi2T_in, multi2T.MPP()) + + +def test_Multi2T_IV(multi2T): + + test_file = "oldpvc_Multi2T_IV.csv" + + multi2T_in = pd.read_csv(Path().cwd().joinpath("tests", "test_files", test_file), index_col=0) + + MPP = multi2T.MPP() + voltages = np.linspace(-0.2, MPP["Voc"]) + currents = np.linspace(-0.2, MPP["Isc"]) + + I2T = np.vectorize(multi2T.I2T) + V2T = np.vectorize(multi2T.V2T) + + Vboth = np.concatenate((voltages, V2T(currents)), axis=None) + Iboth = np.concatenate((I2T(voltages), currents), axis=None) + # sort + p = np.argsort(Vboth) + Vlight = Vboth[p] + Ilight = Iboth[p] + multi2T_out = pd.DataFrame({"v": Vlight, "i": Ilight}).dropna() + + pd.testing.assert_series_equal(multi2T_in["v"], multi2T_out["v"]) + pd.testing.assert_series_equal(multi2T_in["i"], multi2T_out["i"]) + + +def test_Tandem3T(tandem3T): + + test_file = "oldpvc_Tandem3T.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(test_str, tandem3T.__str__()) + + + # with open(os.path.join("tests", "Tandem3T.txt"), "r", encoding="utf8") as fid: + # tandem3T_in = [line.rstrip().strip() for line in fid] + + # for i, r in enumerate(tandem3T_in): + # tandem3T_out = tandem3T.__str__().split("\n")[i].strip() + # assert tandem3T_out in tandem3T_in + # # if tandem3T_out not in tandem3T_in: + # # print(tandem3T_in) + + +def test_Tandem3T_MPP(tandem3T): + + test_file = "oldpvc_Tandem3T_MPP.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",tandem3T.MPP().__str__())) + +def test_Tandem3T_CM(tandem3T): + + test_file = "oldpvc_Tandem3T_CM.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + tandem3T_in = [line.rstrip().strip() for line in fin] + + for i, r in enumerate(tandem3T_in): + tandem3T_out = tandem3T.CM().__str__().split("\n")[i].strip() + assert tandem3T_out in tandem3T_in + + +def test_Tandem3T_VM21(tandem3T): + + test_file = "oldpvc_Tandem3T_VM21.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",tandem3T.VM(2, 1).__str__())) + +def test_Tandem3T_VM32(tandem3T): + + test_file = "oldpvc_Tandem3T_VM32.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",tandem3T.VM(3, 2).__str__())) + + +def test_Tandem3T_VM32_set(tandem3T): + tandem3T.top.set(Eg=1.87, J0ratio=[80.0, 22.0], Jext=0.0131, Gsh=1e-8, Rser=0.1) + tandem3T.bot.set(Eg=1.419, J0ratio=[10.0, 15.0], Jext=0.0128, Gsh=5e-5, Rser=0.2, beta=3, area=0.89) + tandem3T.set(Rz=1) + + test_file = "oldpvc_Tandem3T_VM32_set.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",tandem3T.VM(3, 2).__str__())) + + dev2T = Multi2T.from_3T(tandem3T) + + test_file = "oldpvc_Tandem3T_to_2Tcopy.txt" + with open(Path().cwd().joinpath("tests", "test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(test_str, dev2T.__str__()) + + +if __name__ == "__main__": + test_Multi2T_MPP(Multi2T()) diff --git a/tests/test_qe.py b/tests/test_qe.py new file mode 100644 index 0000000..d81f21d --- /dev/null +++ b/tests/test_qe.py @@ -0,0 +1,43 @@ +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest + +import pvcircuit as pvc +from pvcircuit import EQE + + +def get_measured_eqe(): + path = Path(pvc.datapath) + eqe_file = "MM927Bn5CEQE.csv" + data = pd.read_csv(path.joinpath(eqe_file), index_col=0) + eqe = pvc.EQE(data, data.index, "TestEQE") + return eqe + +@pytest.fixture +def ideal_eqe(): + + return EQE(np.array([1, 1]), np.array([1, 2])) + +@pytest.fixture +def example_eqe(): + + path = Path(pvc.datapath) + eqe_file = "MM927Bn5CEQE.csv" + data = pd.read_csv(path.joinpath(eqe_file), index_col=0) + eqe = pvc.EQE(data, data.index, "TestEQE") + return eqe + + +def test_eqe(ideal_eqe): + assert 1 == 1 + + +if __name__ == "__main__": + + eqe = get_measured_eqe() + + eqe.plot() + plt.show() diff --git a/tests/test_tandem3T.py b/tests/test_tandem3T.py new file mode 100644 index 0000000..8fee311 --- /dev/null +++ b/tests/test_tandem3T.py @@ -0,0 +1,323 @@ +import itertools +import re +from pathlib import Path + +import numpy as np +import pytest + +import pvcircuit as pvc +from pvcircuit import IV3T, Multi2T, Tandem3T + + +@pytest.fixture +def dev2T(): + return Multi2T() + + +@pytest.fixture +def dev3T(): + return Tandem3T() + + +@pytest.fixture +def iv3t(): + return IV3T() + + +@pytest.fixture +def junction(): + return pvc.junction.Junction() + + +def test_tandem3T_str(dev3T): + + test_file = "Tandem3T_str.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(dev3T.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",test_str)) + + +def test_tandem3T_maxsetters(dev3T): + # test the area and TC setter + + top_area = dev3T.top.totalarea + bot_area = dev3T.bot.totalarea + + tc = max(dev3T.top.TC, dev3T.bot.TC) + + np.testing.assert_almost_equal(dev3T.totalarea, max(top_area, bot_area)) + np.testing.assert_almost_equal(dev3T.TC, tc) + + set_area = max(top_area, bot_area) * 100 + dev3T.top.set(area=set_area) + np.testing.assert_almost_equal(dev3T.totalarea, set_area) + np.testing.assert_almost_equal(dev3T.lightarea, set_area) + + set_TC = tc * 200 + dev3T.top.set(TC=set_TC) + np.testing.assert_almost_equal(dev3T.TC, set_TC) + + +def test_V3T(dev3T, iv3t): + # test 3T voltage from current + iv3t.box("IA", -25e-3, 25e-3, 55, "IB", -30e-3, 30e-3, 55) + iv3t.convert("I", "load2dev") + dev3T.V3T(iv3t) + + test_file = "Tandem3T_V3T-s.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding='utf8') as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + dev3T.bot.set(Jext=20e-3, pn=-1) + dev3T.V3T(iv3t) + + test_file = "Tandem3T_V3T-r.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding='utf8') as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for r-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_J3Tabs(dev3T, iv3t): + # test 3T voltage from current + iv3t.box("VA", -1.5, 0.2, 30, "VB", -1.5, 0.2, 30) + iv3t.convert("V", "load2dev") + dev3T.J3Tabs(iv3t) + + test_file = "Tandem3T_J3TAabs-s.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + dev3T.bot.set(pn=-1) + dev3T.J3Tabs(iv3t) + + test_file = "Tandem3T_J3TAabs-r.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for r-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_I3Trel(dev3T, iv3t): + # test 3T voltage from current + iv3t.box("VA", -1.5, 0.2, 30, "VB", -1.5, 0.2, 30) + iv3t.convert("V", "load2dev") + dev3T.I3Trel(iv3t) + + test_file = "Tandem3T_I3Trel-s.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + dev3T.bot.set(pn=-1) + dev3T.I3Trel(iv3t) + + test_file = "Tandem3T_I3Trel-r.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for r-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_VM(dev3T): + + ratios = [(1, 1), (2, 1), (3, 2)] + for ratio in ratios: + iv3t_vm, iv3t_vmpp = dev3T.VM(*ratio) + + vm_fname = "Tandem3T_iv3t_vm_{}.txt".format("".join(map(str, ratio))) + vmpp_fname = "Tandem3T_iv3t_vmpp_{}.txt".format("".join(map(str, ratio))) + # write test case + # with open(Path().cwd().joinpath("tests","test_files", vm_fname), "w", encoding="utf8") as fout: + # fout.write(iv3t_vm.__str__()) + # with open(Path().cwd().joinpath("tests","test_files", vmpp_fname), "w", encoding="utf8") as fout: + # fout.write(iv3t_vmpp.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", vm_fname), "r", encoding="utf8") as fin: + test_vm = fin.read() + with open(Path().cwd().joinpath("tests","test_files", vmpp_fname), "r", encoding="utf8") as fin: + test_vmpp = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_vm), re.sub(r"\s+"," ",iv3t_vm.__str__())) + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_vmpp), re.sub(r"\s+"," ",iv3t_vmpp.__str__())) + + +def test_CM(dev3T): + dev2T = Multi2T.from_3T(dev3T) + lnout, mpp = dev3T.CM() + v2t = lnout.VA - lnout.VB + i2t = [] + for v in v2t: + i2t.append(dev2T.I2T(v)) + np.testing.assert_array_almost_equal(i2t, lnout.IA) + + mpp2t = dev2T.MPP() + np.testing.assert_almost_equal(mpp2t["Pmp"], mpp.Ptot[0], decimal=6) + np.testing.assert_almost_equal(mpp2t["Vmp"], mpp.VA - mpp.VB, decimal=3) + np.testing.assert_almost_equal(mpp2t["Imp"], -mpp.IA, decimal=5) + np.testing.assert_almost_equal(mpp2t["Imp"], mpp.IB, decimal=5) + np.testing.assert_almost_equal(mpp2t["Imp"], -mpp.Iro, decimal=5) + np.testing.assert_almost_equal(mpp2t["Imp"], mpp.Ito, decimal=5) + + +def test_MPP(dev3T): + # Test the 4T MPP operating point. + mpp = dev3T.MPP() + + # Use single junctions for comparison + tc = Multi2T.from_single_junction(dev3T.top) + bc = Multi2T.from_single_junction(dev3T.bot) + + tc_mpp = tc.MPP(pnts=30) + bc_mpp = bc.MPP(pnts=30) + + mpp = dev3T.MPP(pnts=30) + + np.testing.assert_almost_equal(tc_mpp["Pmp"] + bc_mpp["Pmp"], mpp.Ptot[0], decimal=4) + np.testing.assert_almost_equal(tc_mpp["Imp"], mpp.Ito[0], decimal=4) + np.testing.assert_almost_equal(bc_mpp["Imp"], -mpp.Iro[0], decimal=4) + + +def test_VI0(dev3T): + + for point in [ + "VztIro", + "VrzIto", + "VtrIzo", + ]: + + iv3t = dev3T.VI0(point) + + test_file = f"Tandem3T_VI0_{point}.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + # read fixed test case for s-type + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + +def test_VIpoints(dev3T): + + iv3t = IV3T() + + current_keys = [k for k in iv3t.arraykeys if k.startswith("I") and len(k) > 2] + voltage_keys = [k for k in iv3t.arraykeys if k.startswith("V") and len(k) > 2] + + iv3t = dev3T.VIpoint("Iro", "Izo", "Vzt") + # test a few randomly + combs = list(itertools.product(range(len(current_keys)), range(len(current_keys)), range(len(voltage_keys)))) + combs = [combo for combo in combs if combo[0] != combo[1]] + combids = [4, 42, 21, 43, 23] + for combid in combids: + combo = combs[combid] + iv3t = dev3T.VIpoint(current_keys[combo[0]], current_keys[combo[1]], voltage_keys[combo[2]]) + + test_file = f"Tandem3T_VIpoint_{iv3t.name}.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(iv3t.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",iv3t.__str__())) + + # iv3t_vals = np.concatenate([getattr(iv3t,k) for k in iv3t.arraykeys]) + # if all(~np.isnan(iv3t_vals)): + # testids.append(combid) + + # print(testids) + # import random + # random_ids = random.sample(testids, 5) + + +def test_specialpoints(dev3T): + + special_points = dev3T.specialpoints() + + test_file = "Tandem3T_specialpoints.txt" + # write test case + # with open(Path().cwd().joinpath("tests","test_files", test_file), "w", encoding="utf8") as fout: + # fout.write(special_points.__str__()) + + with open(Path().cwd().joinpath("tests","test_files", test_file), "r", encoding="utf8") as fin: + test_str = fin.read() + + np.testing.assert_string_equal(re.sub(r"\s+"," ",test_str), re.sub(r"\s+"," ",special_points.__str__())) + + +if __name__ == "__main__": + dev3T = Tandem3T() + iv3t = IV3T() + + current_keys = [k for k in iv3t.arraykeys if k.startswith("I") and len(k) > 2] + voltage_keys = [k for k in iv3t.arraykeys if k.startswith("V") and len(k) > 2] + + # test a few randomly + combs = list(itertools.product(range(len(current_keys)), range(len(current_keys)), range(len(voltage_keys)))) + combs = [combo for combo in combs if combo[0] != combo[1]] + combids = range(len(combs)) + testids = [] + testnames = [] + for combid in combids: + combo = combs[combid] + iv3t = dev3T.VIpoint(current_keys[combo[0]], current_keys[combo[1]], voltage_keys[combo[2]]) + iv3t_vals = np.concatenate([getattr(iv3t, k) for k in iv3t.arraykeys]) + if all(~np.isnan(iv3t_vals)): + if iv3t.name not in testnames: + testids.append(combid) + testnames.append(iv3t.name) + + print(testnames) + print(testids) + import random + + random_ids = random.sample(testids, 5) + print(random_ids) + print(testnames) \ No newline at end of file