From f956998eda8652eb87a1f08b5d9610650cfdb6ca Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 10:26:22 -0600 Subject: [PATCH 01/48] Reorg for pip --- .gitignore | 12 +++ README.md | 37 +++++++- docs/sourcecode.rst | 8 +- docs/tutorials-export4converge.rst | 38 ++++---- docs/tutorials-export4pele.rst | 65 +++++++------- source/FuelLib.py => fuellib/__init__.py | 63 +++++++++---- fuellib/_data_locator.py | 76 ++++++++++++++++ fuellib/data/__init__.py | 1 + fuellib/data/fuelData/__init__.py | 1 + fuellib/data/fuelData/dataReferences.md | 52 +++++++++++ fuellib/data/fuelData/gcData/__init__.py | 1 + fuellib/data/fuelData/gcData/decane_init.csv | 2 + .../data/fuelData/gcData/dodecane_init.csv | 2 + fuellib/data/fuelData/gcData/hefa-S1_init.csv | 3 + .../gcData/hefa-WE-SAF-262714_init.csv | 33 +++++++ .../data/fuelData/gcData/hefa-came_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/hefa-mfat_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/hefa-tall_init.csv | 68 ++++++++++++++ .../fuelData/gcData/heptane-decane_init.csv | 3 + fuellib/data/fuelData/gcData/heptane_init.csv | 2 + fuellib/data/fuelData/gcData/jet-a_init.csv | 68 ++++++++++++++ .../fuelData/gcData/posf10264_T30_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/posf10264_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/posf10289_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/posf10325_init.csv | 68 ++++++++++++++ .../data/fuelData/gcData/posf11498_init.csv | 14 +++ .../data/fuelData/gcData/posf4658_init.csv | 68 ++++++++++++++ .../groupDecompositionData/__init__.py | 1 + .../groupDecompositionData/decane.csv | 2 + .../groupDecompositionData/dodecane.csv | 2 + .../groupDecompositionData/hefa-S1.csv | 3 + .../hefa-WE-SAF-262714.csv | 33 +++++++ .../fuelData/groupDecompositionData/hefa.csv | 68 ++++++++++++++ .../groupDecompositionData/heptane-decane.csv | 3 + .../groupDecompositionData/heptane.csv | 2 + .../fuelData/groupDecompositionData/jet-a.csv | 68 ++++++++++++++ .../groupDecompositionData/posf10264.csv | 68 ++++++++++++++ .../groupDecompositionData/posf10289.csv | 68 ++++++++++++++ .../groupDecompositionData/posf10325.csv | 68 ++++++++++++++ .../groupDecompositionData/posf11498.csv | 14 +++ .../groupDecompositionData/posf4658.csv | 68 ++++++++++++++ .../groupDecompositionData/refCompounds.csv | 90 +++++++++++++++++++ .../data/fuelData/propertiesData/__init__.py | 1 + .../data/fuelData/propertiesData/decane.csv | 37 ++++++++ .../data/fuelData/propertiesData/dodecane.csv | 33 +++++++ .../data/fuelData/propertiesData/hefa-S1.csv | 20 +++++ .../propertiesData/hefa-WE-SAF-262714.csv | 20 +++++ .../propertiesData/hefa-jet-a-blends.csv | 10 +++ .../data/fuelData/propertiesData/heptane.csv | 39 ++++++++ .../fuelData/propertiesData/posf10264.csv | 22 +++++ .../fuelData/propertiesData/posf10289.csv | 24 +++++ .../fuelData/propertiesData/posf10325.csv | 22 +++++ .../fuelData/propertiesData/posf11498.csv | 22 +++++ fuellib/data/fuelData/refCompounds.csv | 90 +++++++++++++++++++ fuellib/data/gcmTableData/__init__.py | 1 + fuellib/data/gcmTableData/gcmTable.csv | 15 ++++ fuellib/exporters/__init__.py | 9 ++ .../exporters/converge.py | 75 +++++++--------- .../exporters/pele.py | 57 ++++++++---- pyproject.toml | 78 ++++++++++++++++ tests/get_pred_and_data.py | 11 +-- tests/test_accuracy.py | 9 +- tests/test_api.py | 9 +- tutorials/basic.py | 9 +- tutorials/compositionPlots.py | 8 +- tutorials/hefaBlends.py | 9 +- tutorials/mixtureProperties.py | 9 +- 67 files changed, 2041 insertions(+), 181 deletions(-) rename source/FuelLib.py => fuellib/__init__.py (96%) create mode 100644 fuellib/_data_locator.py create mode 100644 fuellib/data/__init__.py create mode 100644 fuellib/data/fuelData/__init__.py create mode 100644 fuellib/data/fuelData/dataReferences.md create mode 100644 fuellib/data/fuelData/gcData/__init__.py create mode 100644 fuellib/data/fuelData/gcData/decane_init.csv create mode 100644 fuellib/data/fuelData/gcData/dodecane_init.csv create mode 100644 fuellib/data/fuelData/gcData/hefa-S1_init.csv create mode 100644 fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv create mode 100644 fuellib/data/fuelData/gcData/hefa-came_init.csv create mode 100644 fuellib/data/fuelData/gcData/hefa-mfat_init.csv create mode 100644 fuellib/data/fuelData/gcData/hefa-tall_init.csv create mode 100644 fuellib/data/fuelData/gcData/heptane-decane_init.csv create mode 100644 fuellib/data/fuelData/gcData/heptane_init.csv create mode 100644 fuellib/data/fuelData/gcData/jet-a_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf10264_T30_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf10264_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf10289_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf10325_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf11498_init.csv create mode 100644 fuellib/data/fuelData/gcData/posf4658_init.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/__init__.py create mode 100644 fuellib/data/fuelData/groupDecompositionData/decane.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/dodecane.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/hefa.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/heptane-decane.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/heptane.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/jet-a.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/posf10264.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/posf10289.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/posf10325.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/posf11498.csv create mode 100644 fuellib/data/fuelData/groupDecompositionData/posf4658.csv create mode 100755 fuellib/data/fuelData/groupDecompositionData/refCompounds.csv create mode 100644 fuellib/data/fuelData/propertiesData/__init__.py create mode 100644 fuellib/data/fuelData/propertiesData/decane.csv create mode 100644 fuellib/data/fuelData/propertiesData/dodecane.csv create mode 100755 fuellib/data/fuelData/propertiesData/hefa-S1.csv create mode 100644 fuellib/data/fuelData/propertiesData/hefa-WE-SAF-262714.csv create mode 100644 fuellib/data/fuelData/propertiesData/hefa-jet-a-blends.csv create mode 100644 fuellib/data/fuelData/propertiesData/heptane.csv create mode 100644 fuellib/data/fuelData/propertiesData/posf10264.csv create mode 100644 fuellib/data/fuelData/propertiesData/posf10289.csv create mode 100644 fuellib/data/fuelData/propertiesData/posf10325.csv create mode 100755 fuellib/data/fuelData/propertiesData/posf11498.csv create mode 100644 fuellib/data/fuelData/refCompounds.csv create mode 100644 fuellib/data/gcmTableData/__init__.py create mode 100644 fuellib/data/gcmTableData/gcmTable.csv create mode 100644 fuellib/exporters/__init__.py rename source/Export4Converge.py => fuellib/exporters/converge.py (92%) rename source/Export4Pele.py => fuellib/exporters/pele.py (95%) create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore index fa440e7..a337898 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,17 @@ _build* generated* sprayPropsGCM* mixturePropsGCM* +exportData +# Python packaging +*.egg-info/ +dist/ +build/ +*.egg +*.whl + +# Virtual environments +.env +env/ +venv/ diff --git a/README.md b/README.md index 9d3ae60..dd91be7 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,43 @@ The following conda environment is required to run this code: conda create --name fuellib-env matplotlib pandas scipy black=26.3.1 ~~~ +## Installation + +1. **Clone the repository:** + ~~~ + git clone https://github.com/NatLabRockies/FuelLib.git + cd FuelLib + ~~~ + +2. **Create and activate the conda environment:** + ~~~ + conda create --name fuellib-env matplotlib pandas scipy black=26.3.1 + conda activate fuellib-env + ~~~ + +3. **Install FuelLib in development mode:** + ~~~ + pip install -e . + ~~~ + +This will install FuelLib and make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available in your environment. + ## Running the Code -This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). +This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). + +### Command-Line Exporters +After installing FuelLib with `pip install -e .`, you can use the command-line exporters to generate fuel properties for CFD simulations: + +- `fl-export-pele`: Export fuel properties for PelePhysics simulations +- `fl-export-converge`: Export fuel properties for Converge simulations + +For example: +```bash +fl-export-pele -f posf10264 +fl-export-converge -f posf10325 +``` + +Run `fl-export-pele -h` or `fl-export-converge -h` for detailed usage information. # Contributing New contributions are always welcome. If you have an idea for a new feature follow these steps: diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index 84fa754..53ebce1 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -14,11 +14,13 @@ FuelLib File Organization - **groupDecompositionData:** directory containing a collection of functional group decompositions - **propertiesData:** directory containing measurement or predicted data for validation (see *fuelData/dataReferences.md*) - **gcmTableData:** directory that contains the pre-tabulated group contributions -- **source:** directory containing the main source code files +- **fuellib:** main package directory containing: - - ``Export4Converge.py``: script that exports mixture properties over a range of user specified temperatures for use in Converge simulations. - - ``Export4Pele.py``: script that exports critical properties and initial mass fraction data for use in Pele simulations. - ``FuelLib.py``: class for enabling GCM predictions + - **exporters:** subpackage with CLI exporters for generating fuel properties + + - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) + - ``pele.py``: exporter for PelePhysics simulations (CLI: ``fl-export-pele``) - **tests:** directory containing CI unit tests for FuelLib. The CI test checks if the cumulative error of property predictions of a new proposed model are less than or equal to the current model. diff --git a/docs/tutorials-export4converge.rst b/docs/tutorials-export4converge.rst index 0a50c14..3b97c72 100644 --- a/docs/tutorials-export4converge.rst +++ b/docs/tutorials-export4converge.rst @@ -1,7 +1,7 @@ Exporting Properties for Converge ---------------------------------- -The export script, ``Export4Converge.py`` generates property data files for use in Converge CFD simulations. +The export script, ``fl-export-converge``, generates property data files for use in Converge CFD simulations. There are two options for exporting data: 1. **Mixture Properties**: This option generates a csv file named ``mixturePropsGCM_.csv`` containing @@ -28,15 +28,18 @@ The properties include: terminal output and should be considered when using the mixture properties in a simulation. This example walks through the process and the available options for exporting GCM-based properties for -"posf10325", which is conventional Jet-A, using the ``Export4Converge.py`` script. +"posf10325", which is conventional Jet-A, using the ``fl-export-converge`` command. Default Options ^^^^^^^^^^^^^^^ -From the ``FuelLib`` directory, run the following command in the terminal, noting that ``--fuel_name`` is the only required input: :: +After installing FuelLib with ``pip install -e .``, run the following command in the terminal, noting that ``--fuel_name`` is the only required input: :: - cd FuelLib/source - python Export4Converge.py --fuel_name posf10325 + fl-export-converge --fuel_name posf10325 + +Or using the short option ``-f``: :: + + fl-export-converge -f posf10325 This generates the files for each compound and a composition description in ``FuelLib/exportData/posf10325`` with @@ -45,20 +48,23 @@ property predictions from 0 K to 1000 K for use in a Converge simulation. Additional Options ^^^^^^^^^^^^^^^^^^ -There are several additional options that can be specified when running the export script: +There are several additional options that can be specified when running the ``fl-export-converge`` command: -- ``--units``: Specify the units for the mixture properties. The default is "mks" but users can set the units to "cgs". -- ``--temp_min``: Specify the minimum temperature. The default is 0 K. -- ``--temp_max``: Specify the maximum temperature. The default is 1000 K. -- ``--temp_step``: Specify the temperature step size. The default is :math:`\Delta T = 10` K. -- ``--export_dir``: Specify the directory to export the file. The default is "FuelLib/exportData". -- ``--fuel_data_dir``: Specify the directory containing the fuel data files. The default is "FuelLib/fuelData". -- ``--export_mix``: Set this flag to export mixture properties only. If not set, individual component properties and composition are exported. +- ``-D, --fuel_data_dir PATH``: Directory containing the fuel data files. Default: ``FuelLib/fuelData``. +- ``-u, --units {mks,cgs}``: Units for the properties. Default: ``mks``. +- ``-t, --temp_min K``: Minimum temperature for property calculations. Default: ``0``. +- ``-T, --temp_max K``: Maximum temperature for property calculations. Default: ``1000``. +- ``-s, --temp_step K``: Step size for temperature. Default: ``10``. +- ``-o, --export_dir PATH``: Directory to export the file. Default: ``./exportData``. +- ``-m, --export_mix {true,false}``: Export mixture properties only (no individual components). Default: ``false``. + +For example, run the following command to export mixture properties from 273 K to 550 K with 5 K steps: :: + + fl-export-converge -f posf10325 -m true -t 273 -T 550 -s 5 -For example, run the following command in the terminal: :: +Or with long options: :: - cd FuelLib/source - python Export4Converge.py --fuel_name posf10325 --export_mix True --temp_min 273 --temp_max 550 + fl-export-converge --fuel_name posf10325 --export_mix true --temp_min 273 --temp_max 550 --temp_step 5 This generates the file ``FuelLib/exportData/mixturePropsGCM_posf10325.csv`` with mixture diff --git a/docs/tutorials-export4pele.rst b/docs/tutorials-export4pele.rst index 0e6abcb..31d0105 100644 --- a/docs/tutorials-export4pele.rst +++ b/docs/tutorials-export4pele.rst @@ -16,7 +16,7 @@ and the original `PeleMP (MP) model = (3, 9): + from importlib.resources import files +else: + from importlib_resources import files + + +def get_data_dir(): + """ + Get the path to the embedded data directory. + + :return: Absolute path to the data directory. + :rtype: str + """ + data_ref = files("fuellib").joinpath("data") + # Convert to a concrete path + return str(data_ref) + + +def get_gcmtable_dir(): + """ + Get the path to the GCM table data directory. + + :return: Absolute path to gcmTableData directory. + :rtype: str + """ + return os.path.join(get_data_dir(), "gcmTableData") + + +def get_fueldata_dir(): + """ + Get the path to the fuel data directory. + + :return: Absolute path to fuelData directory. + :rtype: str + """ + return os.path.join(get_data_dir(), "fuelData") + + +def get_fueldata_gc_dir(): + """ + Get the path to the GC data subdirectory. + + :return: Absolute path to fuelData/gcData directory. + :rtype: str + """ + return os.path.join(get_fueldata_dir(), "gcData") + + +def get_fueldata_decomp_dir(): + """ + Get the path to the group decomposition data subdirectory. + + :return: Absolute path to fuelData/groupDecompositionData directory. + :rtype: str + """ + return os.path.join(get_fueldata_dir(), "groupDecompositionData") + + +def get_fueldata_props_dir(): + """ + Get the path to the properties data subdirectory. + + :return: Absolute path to fuelData/propertiesData directory. + :rtype: str + """ + return os.path.join(get_fueldata_dir(), "propertiesData") diff --git a/fuellib/data/__init__.py b/fuellib/data/__init__.py new file mode 100644 index 0000000..a3928fa --- /dev/null +++ b/fuellib/data/__init__.py @@ -0,0 +1 @@ +"""FuelLib embedded data package.""" diff --git a/fuellib/data/fuelData/__init__.py b/fuellib/data/fuelData/__init__.py new file mode 100644 index 0000000..7693958 --- /dev/null +++ b/fuellib/data/fuelData/__init__.py @@ -0,0 +1 @@ +"""Fuel data.""" diff --git a/fuellib/data/fuelData/dataReferences.md b/fuellib/data/fuelData/dataReferences.md new file mode 100644 index 0000000..6330140 --- /dev/null +++ b/fuellib/data/fuelData/dataReferences.md @@ -0,0 +1,52 @@ +## References for fuel data + +# GCxGC Data +The provided GC x GC data is for the weight % of the fuel. + +## POSF Fuels +The GCxGC data for the POSF fuels comes from the [National Jet Fuels Combustion Program](https://doi.org/10.2514/1.J055361) (NJFCP) as provided by the Air Force Research Laboratory in [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf) and [Edwards (2017)](https://doi.org/10.2514/6.2017-0146): +* gcData/posf4658_init.csv (from Appendix D [Edwards (2017)](https://doi.org/10.2514/6.2017-0146)) +* gcData/posf10264_init.csv +* gcData/posf10289_init.csv +* gcData/posf10325_init.csv +* gcData/posf11498_init.csv + +## HEFA:Jet-A Blends +GCxGC data for HEFA fuels produced from different feedstocks (camelina, tallow, and mixed fat) courtesy of [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787). Note that these can be blended with Jet-A to reproduce the density and viscosity measurement data from that paper: +* gcData/hefa-came.csv +* gcData/hefa-tall.csv +* gcData/hefa-mfat.csv +* gcData/jet-a.csv + +# Group Decomposition Data + +## POSF Fuels +The decompositions of each compound into its functional groups for the POSF fuels originated from [Govindaraju & Ihme (2016)](https://doi.org/10.1016/j.ijheatmasstransfer.2016.06.079), but have been updated for additional accuracy and to include the specific reference compounds used: +* groupDecompositionData/posf4658.csv +* groupDecompositionData/posf10264.csv +* groupDecompositionData/posf10289.csv +* groupDecompositionData/posf10325.csv +* groupDecompositionData/posf11498.csv + +## HEFA:Jet-A Blends +The group decompositions of the HEFA and Jet-A from [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787) have been derived from the `posf10325` decomposition: +* groupDecompositionData/hefa.csv +* groupDecompositionData/jet-a.csv + +# Fuel Properties Data +## Single Component Fuels +The properties data for the single component fuels is from [NIST WebBook](https://webbook.nist.gov/chemistry/): +* propertiesData/decane-NIST.csv +* propertiesData/dodecane-NIST.csv +* propertiesData/heptane-NIST.csv + +## POSF Fuels +The properties data for POSF fuels is from the AFRL [Edwards (2017)](https://doi.org/10.2514/6.2017-0146) and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf): +* propertiesData/posf10264.csv +* propertiesData/posf10289.csv +* propertiesData/posf10325.csv +* propertiesData/posf11498.csv + +## HEFA:Jet-A Blends +The properties data for the HEFA:Jet-A blends are from [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787) +* propertiesData/hefa-jet-a-blends.csv \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/__init__.py b/fuellib/data/fuelData/gcData/__init__.py new file mode 100644 index 0000000..2bd91d6 --- /dev/null +++ b/fuellib/data/fuelData/gcData/__init__.py @@ -0,0 +1 @@ +"""GC data.""" diff --git a/fuellib/data/fuelData/gcData/decane_init.csv b/fuellib/data/fuelData/gcData/decane_init.csv new file mode 100644 index 0000000..b0d0709 --- /dev/null +++ b/fuellib/data/fuelData/gcData/decane_init.csv @@ -0,0 +1,2 @@ +Compound,Weight % +NC10H22,100 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/dodecane_init.csv b/fuellib/data/fuelData/gcData/dodecane_init.csv new file mode 100644 index 0000000..a9a068e --- /dev/null +++ b/fuellib/data/fuelData/gcData/dodecane_init.csv @@ -0,0 +1,2 @@ +Compound,Weight % +NC12H26,100 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-S1_init.csv b/fuellib/data/fuelData/gcData/hefa-S1_init.csv new file mode 100644 index 0000000..ecb828e --- /dev/null +++ b/fuellib/data/fuelData/gcData/hefa-S1_init.csv @@ -0,0 +1,3 @@ +Compound,Weight % +2-methylnonane,59.57069121 +n-undecane,40.42930879 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv b/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv new file mode 100644 index 0000000..63fda34 --- /dev/null +++ b/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv @@ -0,0 +1,33 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +C2-Benzene,ethyl benzene ,C2-BENZ,0.057556412 +C3-Benzene,propyl benzene,C3-BENZ,0.087931343 +C4-Benzene,butyl benzene,C4-BENZ,0.055032501 +C5-Benzene,pentyl benzene,C5-BENZ,0.026794203 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.199891503 +C08-Isoparaffin,2-methyl heptane,C8H18-2,2.370108437 +C09-Isoparaffin,2-methyl octane,C9H20-2,12.77270292 +C10-Isoparaffin,2-methyl nonane,C10H22-2,13.57486711 +C11-Isoparaffin,2-methyl decane,C11H24-2,12.23020367 +C12-Isoparaffin,2-methyl undecane,C12H26-2,9.826870781 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,7.725886046 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,5.514863988 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,6.842162663 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,3.510088296 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.133370244 +n-C07,n-heptane,NC7H16,0.148235261 +n-C08,n-octane,NC8H18,1.487407628 +n-C09,n-nonane,NC9H20,2.972384727 +n-C10,n-decane,NC10H22,2.700025728 +n-C11,n-undecane,NC11H24,2.274630182 +n-C12,n-dodecane,NC12H26,1.769651957 +n-C13,n-tridecane,NC13H28,2.68987968 +n-C14,n-tetradecane,NC14H30,3.014507942 +n-C15,n-pentadecane,NC15H32,2.491315435 +n-C16,n-hexadecane (cetane),NC16H34,0.960304858 +C05-Monocycloparaffin,cycopentane,C5-CYCLO,0.940382227 +C07-Monocycloparaffin,methyl cyclohexane,C7-CYCLO,0.075019973 +C08-Monocycloparaffin,ethyl cyclohexane,C8-CYCLO,0.382113294 +C09-Monocycloparaffin,propyl cyclohexane,C9-CYCLO,1.884099028 +C10-Monocycloparaffin,butyl cyclohexane,C10-CYCLO,0.844267369 +C11-Monocycloparaffin,pentyl cyclohexane,C11-CYCLO,0.327108201 +C12-Monocycloparaffin,hexyl cyclohexane,C12-CYCLO,0.110336399 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-came_init.csv b/fuellib/data/fuelData/gcData/hefa-came_init.csv new file mode 100644 index 0000000..527882a --- /dev/null +++ b/fuellib/data/fuelData/gcData/hefa-came_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0 +C2-Benzene,ethyl benzene ,C6H5C2H5,0.01 +C3-Benzene,propyl benzene,C6H5C3H7,0.02 +C4-Benzene,butyl benzene,C6H5C4H9,0 +C5-Benzene,pentyl benzene,C6H5C5H11,0 +C6-Benzene,hexyl benzene,C6H5C6H13,0 +C7-Benzene,heptyl benzene,C6H5C7H15,0 +C8-Benzene,octyl benzene,C6H5C8H17,0 +C9-Benzene,nonyl benzene,C6H5C9H19,0 +Diaromatic-C10,naphthalene,NAPH,0 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 +Cycloaromatic-C09,indane,INDANE,0 +Cycloaromatic-C10,tetralin,TETRA,0 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0 +C08-Isoparaffin,2-methyl heptane,C8H18-2,1.51 +C09-Isoparaffin,2-methyl octane,C9H20-2,11.09 +C10-Isoparaffin,2-methyl nonane,C10H22-2,11.1 +C11-Isoparaffin,2-methyl decane,C11H24-2,9.62 +C12-Isoparaffin,2-methyl undecane,C12H26-2,8.27 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,8.33 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,6.39 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,5.42 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,2.14 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,21.58 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,4.71 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 +n-C07,n-heptane,NC7H16,0 +n-C08,n-octane,NC8H18,0.83 +n-C09,n-nonane,NC9H20,1.92 +n-C10,n-decane,NC10H22,1.4 +n-C11,n-undecane,NC11H24,0.84 +n-C12,n-dodecane,NC12H26,0.59 +n-C13,n-tridecane,NC13H28,0.49 +n-C14,n-tetradecane,NC14H30,0.23 +n-C15,n-pentadecane,NC15H32,0.46 +n-C16,n-hexadecane (cetane),NC16H34,0.2 +n-C17,n-heptadecane,NC17H36,0.12 +n-C18,n-octadecane,NC18H38,0 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.1 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.94 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.52 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.15 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.04 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.01 +C10-Dicycloparaffin,Decalin,DECALIN,0 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-mfat_init.csv b/fuellib/data/fuelData/gcData/hefa-mfat_init.csv new file mode 100644 index 0000000..2c196c9 --- /dev/null +++ b/fuellib/data/fuelData/gcData/hefa-mfat_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.01 +C2-Benzene,ethyl benzene ,C6H5C2H5,0 +C3-Benzene,propyl benzene,C6H5C3H7,0.01 +C4-Benzene,butyl benzene,C6H5C4H9,0 +C5-Benzene,pentyl benzene,C6H5C5H11,0 +C6-Benzene,hexyl benzene,C6H5C6H13,0 +C7-Benzene,heptyl benzene,C6H5C7H15,0 +C8-Benzene,octyl benzene,C6H5C8H17,0 +C9-Benzene,nonyl benzene,C6H5C9H19,0 +Diaromatic-C10,naphthalene,NAPH,0 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 +Cycloaromatic-C09,indane,INDANE,0 +Cycloaromatic-C10,tetralin,TETRA,0 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 +C08-Isoparaffin,2-methyl heptane,C8H18-2,1.77 +C09-Isoparaffin,2-methyl octane,C9H20-2,3.65 +C10-Isoparaffin,2-methyl nonane,C10H22-2,6.69 +C11-Isoparaffin,2-methyl decane,C11H24-2,10.33 +C12-Isoparaffin,2-methyl undecane,C12H26-2,12.37 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,11.54 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,13.98 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,4.29 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,20.73 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.29 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,3.44 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 +n-C07,n-heptane,NC7H16,0 +n-C08,n-octane,NC8H18,0.54 +n-C09,n-nonane,NC9H20,1 +n-C10,n-decane,NC10H22,1.42 +n-C11,n-undecane,NC11H24,1.36 +n-C12,n-dodecane,NC12H26,1.44 +n-C13,n-tridecane,NC13H28,0.87 +n-C14,n-tetradecane,NC14H30,1.67 +n-C15,n-pentadecane,NC15H32,0.18 +n-C16,n-hexadecane (cetane),NC16H34,0.7 +n-C17,n-heptadecane,NC17H36,0.01 +n-C18,n-octadecane,NC18H38,0 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.07 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.76 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.41 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.27 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.14 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0.02 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0.01 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0 +C10-Dicycloparaffin,Decalin,DECALIN,0 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-tall_init.csv b/fuellib/data/fuelData/gcData/hefa-tall_init.csv new file mode 100644 index 0000000..75bebde --- /dev/null +++ b/fuellib/data/fuelData/gcData/hefa-tall_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0 +C2-Benzene,ethyl benzene ,C6H5C2H5,0 +C3-Benzene,propyl benzene,C6H5C3H7,0 +C4-Benzene,butyl benzene,C6H5C4H9,0 +C5-Benzene,pentyl benzene,C6H5C5H11,0 +C6-Benzene,hexyl benzene,C6H5C6H13,0 +C7-Benzene,heptyl benzene,C6H5C7H15,0 +C8-Benzene,octyl benzene,C6H5C8H17,0 +C9-Benzene,nonyl benzene,C6H5C9H19,0 +Diaromatic-C10,naphthalene,NAPH,0 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 +Cycloaromatic-C09,indane,INDANE,0 +Cycloaromatic-C10,tetralin,TETRA,0 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.06 +C09-Isoparaffin,2-methyl octane,C9H20-2,6.13 +C10-Isoparaffin,2-methyl nonane,C10H22-2,12.14 +C11-Isoparaffin,2-methyl decane,C11H24-2,12.6 +C12-Isoparaffin,2-methyl undecane,C12H26-2,13.52 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,12.69 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,8.75 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,21.74 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,4.13 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 +n-C07,n-heptane,NC7H16,0 +n-C08,n-octane,NC8H18,0.1 +n-C09,n-nonane,NC9H20,1.84 +n-C10,n-decane,NC10H22,1.69 +n-C11,n-undecane,NC11H24,1.33 +n-C12,n-dodecane,NC12H26,1.12 +n-C13,n-tridecane,NC13H28,0.86 +n-C14,n-tetradecane,NC14H30,0.56 +n-C15,n-pentadecane,NC15H32,0.32 +n-C16,n-hexadecane (cetane),NC16H34,0 +n-C17,n-heptadecane,NC17H36,0 +n-C18,n-octadecane,NC18H38,0 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.22 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.18 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.02 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.01 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0 +C10-Dicycloparaffin,Decalin,DECALIN,0 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/heptane-decane_init.csv b/fuellib/data/fuelData/gcData/heptane-decane_init.csv new file mode 100644 index 0000000..70680b1 --- /dev/null +++ b/fuellib/data/fuelData/gcData/heptane-decane_init.csv @@ -0,0 +1,3 @@ +Compound,Weight % +NC7H16,73.75 +NC10H22,26.25 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/heptane_init.csv b/fuellib/data/fuelData/gcData/heptane_init.csv new file mode 100644 index 0000000..d57c668 --- /dev/null +++ b/fuellib/data/fuelData/gcData/heptane_init.csv @@ -0,0 +1,2 @@ +Compound,Weight % +NC7H16,100 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/jet-a_init.csv b/fuellib/data/fuelData/gcData/jet-a_init.csv new file mode 100644 index 0000000..07d4e30 --- /dev/null +++ b/fuellib/data/fuelData/gcData/jet-a_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.07 +C2-Benzene,ethyl benzene ,C6H5C2H5,1.79 +C3-Benzene,propyl benzene,C6H5C3H7,4.54 +C4-Benzene,butyl benzene,C6H5C4H9,3.27 +C5-Benzene,pentyl benzene,C6H5C5H11,2.73 +C6-Benzene,hexyl benzene,C6H5C6H13,1.76 +C7-Benzene,heptyl benzene,C6H5C7H15,0.98 +C8-Benzene,octyl benzene,C6H5C8H17,0.47 +C9-Benzene,nonyl benzene,C6H5C9H19,0.15 +Diaromatic-C10,naphthalene,NAPH,0.11 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.44 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.63 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.51 +Cycloaromatic-C09,indane,INDANE,0.14 +Cycloaromatic-C10,tetralin,TETRA,0.45 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,2.43 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.21 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.46 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.42 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.31 +C09-Isoparaffin,2-methyl octane,C9H20-2,4.12 +C10-Isoparaffin,2-methyl nonane,C10H22-2,6.63 +C11-Isoparaffin,2-methyl decane,C11H24-2,5.02 +C12-Isoparaffin,2-methyl undecane,C12H26-2,3.21 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,2.95 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,2.39 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,1.66 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.87 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.19 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.08 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 +n-C07,n-heptane,NC7H16,0 +n-C08,n-octane,NC8H18,0.67 +n-C09,n-nonane,NC9H20,4.42 +n-C10,n-decane,NC10H22,4.73 +n-C11,n-undecane,NC11H24,3.44 +n-C12,n-dodecane,NC12H26,2.49 +n-C13,n-tridecane,NC13H28,1.93 +n-C14,n-tetradecane,NC14H30,1.31 +n-C15,n-pentadecane,NC15H32,0.79 +n-C16,n-hexadecane (cetane),NC16H34,0.38 +n-C17,n-heptadecane,NC17H36,0.09 +n-C18,n-octadecane,NC18H38,0.02 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.19 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,5.81 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,5.26 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.58 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,2.82 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.5 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,1.53 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0.65 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.02 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.86 +C09-Dicycloparaffin,Hydrindane,HYDRIND,1.21 +C10-Dicycloparaffin,Decalin,DECALIN,1.05 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.8 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.27 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.09 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf10264_T30_init.csv b/fuellib/data/fuelData/gcData/posf10264_T30_init.csv new file mode 100644 index 0000000..efa6e5e --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf10264_T30_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.026243851 +C2-Benzene,ethyl benzene ,C6H5C2H5,0.563849082 +C3-Benzene,propyl benzene,C6H5C3H7,2.170825974 +C4-Benzene,butyl benzene,C6H5C4H9,1.868676471 +C5-Benzene,pentyl benzene,C6H5C5H11,1.243556866 +C6-Benzene,hexyl benzene,C6H5C6H13,0.815117038 +C7-Benzene,heptyl benzene,C6H5C7H15,0.343926707 +C8-Benzene,octyl benzene,C6H5C8H17,0.177068058 +C9-Benzene,nonyl benzene,C6H5C9H19,0.092682255 +Diaromatic-C10,naphthalene,NAPH,0.158282571 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.563748085 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.723177759 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.397346321 +Cycloaromatic-C09,indane,INDANE,0.037303272 +Cycloaromatic-C10,tetralin,TETRA,0.167109231 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.383886527 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.470487331 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.475804054 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.289055519 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.010816054 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.2046366 +C09-Isoparaffin,2-methyl octane,C9H20-2,1.306819247 +C10-Isoparaffin,2-methyl nonane,C10H22-2,6.254544046 +C11-Isoparaffin,2-methyl decane,C11H24-2,8.347290213 +C12-Isoparaffin,2-methyl undecane,C12H26-2,6.280064982 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,5.883941158 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,5.327191919 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,3.183676728 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.074196985 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.291668253 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.044339228 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 +n-C07,n-heptane,NC7H16,0.026471001 +n-C08,n-octane,NC8H18,0.378567896 +n-C09,n-nonane,NC9H20,1.849315933 +n-C10,n-decane,NC10H22,5.651114497 +n-C11,n-undecane,NC11H24,5.617499013 +n-C12,n-dodecane,NC12H26,4.849494222 +n-C13,n-tridecane,NC13H28,3.88941346 +n-C14,n-tetradecane,NC14H30,2.70584866 +n-C15,n-pentadecane,NC15H32,1.176763184 +n-C16,n-hexadecane (cetane),NC16H34,0.333330547 +n-C17,n-heptadecane,NC17H36,0.088344843 +n-C18,n-octadecane,NC18H38,0 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.077136106 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.395905261 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,2.052459083 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.16184899 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,4.046496274 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,3.155585379 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,3.125128759 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,1.734320799 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.157839457 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.16889367 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.031150583 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.009767699 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.232146673 +C10-Dicycloparaffin,Decalin,DECALIN,0.450631891 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.790849113 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.997193825 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.740914494 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.681235908 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.125895154 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.121105243 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf10264_init.csv b/fuellib/data/fuelData/gcData/posf10264_init.csv new file mode 100644 index 0000000..6b89316 --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf10264_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.25 +C2-Benzene,ethyl benzene ,C6H5C2H5,1.98 +C3-Benzene,propyl benzene,C6H5C3H7,4.17 +C4-Benzene,butyl benzene,C6H5C4H9,2.33 +C5-Benzene,pentyl benzene,C6H5C5H11,1.19 +C6-Benzene,hexyl benzene,C6H5C6H13,0.66 +C7-Benzene,heptyl benzene,C6H5C7H15,0.25 +C8-Benzene,octyl benzene,C6H5C8H17,0.12 +C9-Benzene,nonyl benzene,C6H5C9H19,0.06 +Diaromatic-C10,naphthalene,NAPH,0.10 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.41 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.22 +Cycloaromatic-C09,indane,INDANE,0.02 +Cycloaromatic-C10,tetralin,TETRA,0.19 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.37 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.38 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.34 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.19 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.21 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.88 +C09-Isoparaffin,2-methyl octane,C9H20-2,2.59 +C10-Isoparaffin,2-methyl nonane,C10H22-2,8.15 +C11-Isoparaffin,2-methyl decane,C11H24-2,8.38 +C12-Isoparaffin,2-methyl undecane,C12H26-2,5.41 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.63 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.96 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.28 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.75 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.20 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.03 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 +n-C07,n-heptane,NC7H16,0.24 +n-C08,n-octane,NC8H18,1.11 +n-C09,n-nonane,NC9H20,2.97 +n-C10,n-decane,NC10H22,6.46 +n-C11,n-undecane,NC11H24,5.22 +n-C12,n-dodecane,NC12H26,3.99 +n-C13,n-tridecane,NC13H28,2.97 +n-C14,n-tetradecane,NC14H30,1.97 +n-C15,n-pentadecane,NC15H32,0.83 +n-C16,n-hexadecane (cetane),NC16H34,0.23 +n-C17,n-heptadecane,NC17H36,0.06 +n-C18,n-octadecane,NC18H38,0.00 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.51 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.01 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,3.06 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.47 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,3.55 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.45 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,2.25 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,1.19 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.77 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.11 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.02 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.35 +C10-Dicycloparaffin,Decalin,DECALIN,0.47 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.71 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.77 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.52 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.45 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.08 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.11 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf10289_init.csv b/fuellib/data/fuelData/gcData/posf10289_init.csv new file mode 100644 index 0000000..c4092b1 --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf10289_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.03 +C2-Benzene,ethyl benzene ,C6H5C2H5,0.41 +C3-Benzene,propyl benzene,C6H5C3H7,1.32 +C4-Benzene,butyl benzene,C6H5C4H9,2.09 +C5-Benzene,pentyl benzene,C6H5C5H11,1.98 +C6-Benzene,hexyl benzene,C6H5C6H13,1.80 +C7-Benzene,heptyl benzene,C6H5C7H15,1.24 +C8-Benzene,octyl benzene,C6H5C8H17,1.05 +C9-Benzene,nonyl benzene,C6H5C9H19,0.42 +Diaromatic-C10,naphthalene,NAPH,0.09 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.33 +Cycloaromatic-C09,indane,INDANE,0.03 +Cycloaromatic-C10,tetralin,TETRA,0.57 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.91 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.67 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,2.27 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.22 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.13 +C09-Isoparaffin,2-methyl octane,C9H20-2,0.48 +C10-Isoparaffin,2-methyl nonane,C10H22-2,1.66 +C11-Isoparaffin,2-methyl decane,C11H24-2,2.73 +C12-Isoparaffin,2-methyl undecane,C12H26-2,3.36 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,3.57 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.54 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.70 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.65 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.08 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.00 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 +n-C07,n-heptane,NC7H16,0.02 +n-C08,n-octane,NC8H18,0.19 +n-C09,n-nonane,NC9H20,0.64 +n-C10,n-decane,NC10H22,1.41 +n-C11,n-undecane,NC11H24,2.60 +n-C12,n-dodecane,NC12H26,3.09 +n-C13,n-tridecane,NC13H28,2.50 +n-C14,n-tetradecane,NC14H30,1.92 +n-C15,n-pentadecane,NC15H32,0.86 +n-C16,n-hexadecane (cetane),NC16H34,0.11 +n-C17,n-heptadecane,NC17H36,0.01 +n-C18,n-octadecane,NC18H38,0.00 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.08 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.35 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.53 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.25 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.77 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,6.25 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,6.11 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,4.22 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,2.27 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.41 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.01 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.46 +C10-Dicycloparaffin,Decalin,DECALIN,1.04 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,2.84 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,4.33 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,4.53 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,3.14 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.67 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.10 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf10325_init.csv b/fuellib/data/fuelData/gcData/posf10325_init.csv new file mode 100644 index 0000000..7bd11cf --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf10325_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.17 +C2-Benzene,ethyl benzene ,C6H5C2H5,1.10 +C3-Benzene,propyl benzene,C6H5C3H7,2.97 +C4-Benzene,butyl benzene,C6H5C4H9,3.32 +C5-Benzene,pentyl benzene,C6H5C5H11,2.22 +C6-Benzene,hexyl benzene,C6H5C6H13,1.45 +C7-Benzene,heptyl benzene,C6H5C7H15,0.73 +C8-Benzene,octyl benzene,C6H5C8H17,0.52 +C9-Benzene,nonyl benzene,C6H5C9H19,0.42 +Diaromatic-C10,naphthalene,NAPH,0.22 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.66 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.86 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.60 +Cycloaromatic-C09,indane,INDANE,0.02 +Cycloaromatic-C10,tetralin,TETRA,0.26 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.66 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.89 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.85 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.61 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.15 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.44 +C09-Isoparaffin,2-methyl octane,C9H20-2,1.05 +C10-Isoparaffin,2-methyl nonane,C10H22-2,4.20 +C11-Isoparaffin,2-methyl decane,C11H24-2,5.70 +C12-Isoparaffin,2-methyl undecane,C12H26-2,5.63 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.22 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.20 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.51 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.00 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.39 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.11 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.03 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.03 +n-C07,n-heptane,NC7H16,0.17 +n-C08,n-octane,NC8H18,0.54 +n-C09,n-nonane,NC9H20,1.42 +n-C10,n-decane,NC10H22,3.26 +n-C11,n-undecane,NC11H24,4.29 +n-C12,n-dodecane,NC12H26,3.74 +n-C13,n-tridecane,NC13H28,2.80 +n-C14,n-tetradecane,NC14H30,2.02 +n-C15,n-pentadecane,NC15H32,1.03 +n-C16,n-hexadecane (cetane),NC16H34,0.43 +n-C17,n-heptadecane,NC17H36,0.21 +n-C18,n-octadecane,NC18H38,0.06 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.36 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.78 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,2.30 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.11 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.43 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,3.73 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,4.19 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.19 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.33 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.42 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.24 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.43 +C10-Dicycloparaffin,Decalin,DECALIN,0.72 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.52 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.57 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.21 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.81 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.27 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.16 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf11498_init.csv b/fuellib/data/fuelData/gcData/posf11498_init.csv new file mode 100644 index 0000000..fd876d2 --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf11498_init.csv @@ -0,0 +1,14 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.61 +C09-Isoparaffin,2-methyl octane,C9H20-2,0.17 +C10-Isoparaffin,2-methyl nonane,C10H22-2,0.22 +C11-Isoparaffin,2-methyl decane,C11H24-2,0.52 +C12-Isoparaffin,2-methyl undecane,C12H26-2,78.28 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,1.23 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,0.53 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,16.25 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,1.69 +C24-Isoparaffin,2-methyltricosane,C24H50-2,0.12 +C12-Alkene,1-dodecene,DODECENE-1,0.08 +C16-Alkene,1-hexadecene,HEXADECENE-1,0.24 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf4658_init.csv b/fuellib/data/fuelData/gcData/posf4658_init.csv new file mode 100644 index 0000000..2f1d77b --- /dev/null +++ b/fuellib/data/fuelData/gcData/posf4658_init.csv @@ -0,0 +1,68 @@ +Compound,Reference Compound,PelePhysics Key,Weight % +Toluene,toluene,C6H5CH3,0.16 +C2-Benzene,ethyl benzene,C6H5C2H5,0.78 +C3-Benzene,propyl benzene,C6H5C3H7,2.24 +C4-Benzene,butyl benzene,C6H5C4H9,3.02 +C5-Benzene,pentyl benzene,C6H5C5H11,2.48 +C6-Benzene,hexyl benzene,C6H5C6H13,1.93 +C7-Benzene,heptyl benzene,C6H5C7H15,1.19 +C8-Benzene,octyl benzene,C6H5C8H17,0.89 +C9-Benzene,nonyl benzene,C6H5C9H19,1.00 +Diaromatic-C10,naphthalene,NAPH,0.12 +Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.42 +Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 +Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.63 +Cycloaromatic-C09,indane,INDANE,0.04 +Cycloaromatic-C10,tetralin,TETRA,0.43 +Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.13 +Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,1.63 +Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.45 +Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.12 +C07-Isoparaffin,2-methyl hexane,C7H16-2,0.23 +C08-Isoparaffin,2-methyl heptane,C8H18-2,0.56 +C09-Isoparaffin,2-methyl octane,C9H20-2,1.08 +C10-Isoparaffin,2-methyl nonane,C10H22-2,3.59 +C11-Isoparaffin,2-methyl decane,C11H24-2,5.12 +C12-Isoparaffin,2-methyl undecane,C12H26-2,5.31 +C13-Isoparaffin,2-methyl dodecane,C13H28-2,5.25 +C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.44 +C15-Isoparaffin,2-methyl tetradecane,C15H32-2,3.10 +C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.66 +C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.69 +C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.19 +C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.08 +C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.02 +n-C07,n-heptane,NC7H16,0.15 +n-C08,n-octane,NC8H18,0.54 +n-C09,n-nonane,NC9H20,1.14 +n-C10,n-decane,NC10H22,2.55 +n-C11,n-undecane,NC11H24,3.62 +n-C12,n-dodecane,NC12H26,3.70 +n-C13,n-tridecane,NC13H28,2.86 +n-C14,n-tetradecane,NC14H30,2.17 +n-C15,n-pentadecane,NC15H32,1.28 +n-C16,n-hexadecane (cetane),NC16H34,0.61 +n-C17,n-heptadecane,NC17H36,0.27 +n-C18,n-octadecane,NC18H38,0.07 +C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.20 +C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.69 +C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.67 +C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.26 +C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,4.11 +C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,4.07 +C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,3.65 +C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.43 +C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.55 +C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.64 +C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.37 +C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.02 +C09-Dicycloparaffin,Hydrindane,HYDRIND,0.29 +C10-Dicycloparaffin,Decalin,DECALIN,0.43 +C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.26 +C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.22 +C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.42 +C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.82 +C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.26 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.05 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/__init__.py b/fuellib/data/fuelData/groupDecompositionData/__init__.py new file mode 100644 index 0000000..cee26ca --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/__init__.py @@ -0,0 +1 @@ +"""Group decomposition data.""" diff --git a/fuellib/data/fuelData/groupDecompositionData/decane.csv b/fuellib/data/fuelData/groupDecompositionData/decane.csv new file mode 100644 index 0000000..b531635 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/decane.csv @@ -0,0 +1,2 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +NC10H22,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/dodecane.csv b/fuellib/data/fuelData/groupDecompositionData/dodecane.csv new file mode 100644 index 0000000..aef9ba0 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/dodecane.csv @@ -0,0 +1,2 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +NC12H26,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv b/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv new file mode 100644 index 0000000..053c076 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv @@ -0,0 +1,3 @@ +Compound,CH3 (1),CH2 (2),CH (3),C (4),CH2=CH (1),CH=CH (2),CH2=C (2),CH=C (3),C=C (4),CH2=C=CH(1),ACH (2),AC (3),ACCH3 (2),ACCH2 (3),ACCH (4),OH (1),ACOH (2),CH3CO (1),CH2CO (2),CHO (1)*,CH3COO (1),CH2COO (2),HCOO (1),CH30 (1),CH20 (2),CH-O (3),FCH20 (1)*,CH2NH2 (1),CHNH2 (2),CH3NH (2),CH2NH (3),CHNH (4)*,CH3N (2),CH2N (3),ACNH2 (2),C5H4N (1),C5H3N (2),CH2CN (1)*,COOH (1),CH2C1 (1),CHC1 (2),CC1 (3),CHC12 (1)*,CC13 (1),CC12 (2),ACC1 (2),CH2N02 (1)*,CHN02 (2)*,ACN02 (2)*,CH2SH (1),C1(1)*,Br (1),CH≡C (1),C≡C (2)*,Cl—(C=C) (3)*,ACF (2),HCON(CH2)2 (2)*,CF3 (1),CF2 (2),CF (3),COO (2),CC12F (1),HCC1F (1),CC1F2 (1),FSpecial (1),CONH2 (1)*,CONHCH3 (1)*,CONHCH2 (1)*,CON(CH3)2 (1)*,CONCH2CH2 (3)*,CON(CH2)2 (3)*,C2H502 (1)*,C2H402 (2),CH3S (1),CH2S (2),CHS (3)*,C4H3S (1),C4H2S (2)*,Group j (CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CR=CRm—CRp=CRk m, p G (0,1), K n G (0,2)","CH3-CHm=CH, m G (0,1), n G (0,2)","CH2-CHm=CH, m G (0,1), n G (0,2)","CH—CUm=CUn or C—CHm=CH/ m G (0,1), n G (0,2)",Alicyclic side-chain CcyclicCm m > 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* +2-methylnonane,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +undecane,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv b/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv new file mode 100644 index 0000000..7bfdb20 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv @@ -0,0 +1,33 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin (lower put as same),3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C05-Monocycloparaffin,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/hefa.csv b/fuellib/data/fuelData/groupDecompositionData/hefa.csv new file mode 100644 index 0000000..53b4bfd --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/hefa.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin (lower put as same),3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/heptane-decane.csv b/fuellib/data/fuelData/groupDecompositionData/heptane-decane.csv new file mode 100644 index 0000000..cf6d35b --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/heptane-decane.csv @@ -0,0 +1,3 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +NC7H16,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +NC10H22,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/heptane.csv b/fuellib/data/fuelData/groupDecompositionData/heptane.csv new file mode 100644 index 0000000..12251cc --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/heptane.csv @@ -0,0 +1,2 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +NC7H16,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/jet-a.csv b/fuellib/data/fuelData/groupDecompositionData/jet-a.csv new file mode 100644 index 0000000..b0216f6 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/jet-a.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10264.csv b/fuellib/data/fuelData/groupDecompositionData/posf10264.csv new file mode 100644 index 0000000..b0216f6 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/posf10264.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10289.csv b/fuellib/data/fuelData/groupDecompositionData/posf10289.csv new file mode 100644 index 0000000..b0216f6 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/posf10289.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10325.csv b/fuellib/data/fuelData/groupDecompositionData/posf10325.csv new file mode 100644 index 0000000..b0216f6 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/posf10325.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf11498.csv b/fuellib/data/fuelData/groupDecompositionData/posf11498.csv new file mode 100644 index 0000000..c598988 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/posf11498.csv @@ -0,0 +1,14 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C24-Isoparaffin,3,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Alkene,1,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Alkene,1,13,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf4658.csv b/fuellib/data/fuelData/groupDecompositionData/posf4658.csv new file mode 100644 index 0000000..b0216f6 --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/posf4658.csv @@ -0,0 +1,68 @@ +Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/refCompounds.csv b/fuellib/data/fuelData/groupDecompositionData/refCompounds.csv new file mode 100755 index 0000000..acbb91d --- /dev/null +++ b/fuellib/data/fuelData/groupDecompositionData/refCompounds.csv @@ -0,0 +1,90 @@ +Compound,CH3 (1),CH2 (2),CH (3),C (4),CH2=CH (1),CH=CH (2),CH2=C (2),CH=C (3),C=C (4),CH2=C=CH(1),ACH (2),AC (3),ACCH3 (2),ACCH2 (3),ACCH (4),OH (1),ACOH (2),CH3CO (1),CH2CO (2),CHO (1)*,CH3COO (1),CH2COO (2),HCOO (1),CH30 (1),CH20 (2),CH-O (3),FCH20 (1)*,CH2NH2 (1),CHNH2 (2),CH3NH (2),CH2NH (3),CHNH (4)*,CH3N (2),CH2N (3),ACNH2 (2),C5H4N (1),C5H3N (2),CH2CN (1)*,COOH (1),CH2C1 (1),CHC1 (2),CC1 (3),CHC12 (1)*,CC13 (1),CC12 (2),ACC1 (2),CH2N02 (1)*,CHN02 (2)*,ACN02 (2)*,CH2SH (1),C1(1)*,Br (1),CH≡C (1),C≡C (2)*,Cl—(C=C) (3)*,ACF (2),HCON(CH2)2 (2)*,CF3 (1),CF2 (2),CF (3),COO (2),CC12F (1),HCC1F (1),CC1F2 (1),FSpecial (1),CONH2 (1)*,CONHCH3 (1)*,CONHCH2 (1)*,CON(CH3)2 (1)*,CONCH2CH2 (3)*,CON(CH2)2 (3)*,C2H502 (1)*,C2H402 (2),CH3S (1),CH2S (2),CHS (3)*,C4H3S (1),C4H2S (2)*,Group j (CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CR=CRm—CRp=CRk m, p G (0,1), K n G (0,2)","CH3-CHm=CH, m G (0,1), n G (0,2)","CH2-CHm=CH, m G (0,1), n G (0,2)","CH—CUm=CUn or C—CHm=CH/ m G (0,1), n G (0,2)",Alicyclic side-chain CcyclicCm m > 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* +Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Benzene,1,8,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Diaromatic-C14,1,2,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C15,1,5,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C21-Isoparaffin,3,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C22-Isoparaffin,3,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C23-Isoparaffin,3,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C24-Isoparaffin,3,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C19,2,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C20,2,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C21,2,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C22,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +n-C23,2,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C18-Monocycloparaffin,1,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C19-Monocycloparaffin,1,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Dicycloparaffin,1,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C17-Dicycloparaffin,1,13,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C13-Tricycloparaffin,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Tricycloparaffin,0,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C10-Alkene,1,7,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C12-Alkene,1,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C14-Alkene,1,11,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +C16-Alkene,1,13,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/__init__.py b/fuellib/data/fuelData/propertiesData/__init__.py new file mode 100644 index 0000000..26ee947 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/__init__.py @@ -0,0 +1 @@ +"""Properties data.""" diff --git a/fuellib/data/fuelData/propertiesData/decane.csv b/fuellib/data/fuelData/propertiesData/decane.csv new file mode 100644 index 0000000..2f9f9af --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/decane.csv @@ -0,0 +1,37 @@ +Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,SurfaceTension,ThermalConductivity +C,g/cm^3,mm^2/s,kPa,Pa*s,N/m,W/m/K +-29.65,0.76929,3.167726085,,0.0024369,0.0285, +-23.15,,,,,0.0279, +-19.65,0.76138,2.503349182,0.00393,0.001906,, +-13.15,,,,,0.0269, +-9.65,0.75352,2.038034823,0.00792,0.0015357,, +-9.55,,,,,,0.1386 +-3.15,,,,,0.026,0.1369 +0.35,0.7457,1.698404184,0.02,0.0012665,, +6.85,,,,,0.025,0.13421 +10.35,0.73791,1.442452332,0.0466,0.0010644,, +16.85,,,,,0.0241,0.13157 +20.35,0.73014,1.244487359,0.1014,0.00090865,, +26.85,,,,,0.0232,0.12896 +30.35,0.72237,1.088015837,0.2071,0.00078595,, +36.85,,,,,0.0223,0.12638 +40.35,0.71459,0.962062162,0.3998,0.00068748,, +46.85,,,,,0.0214,0.12383 +50.35,0.7068,0.85901245,0.734,0.00060715,, +56.85,,,,,0.0205,0.12132 +60.35,0.69898,0.77352714,1.288,0.00054068,, +66.85,,,,,0.0196,0.11884 +70.35,0.69112,0.701716055,2.17,0.00048497,, +76.85,,,,,0.0187,0.1164 +80.35,0.68321,0.640740036,3.524,0.00043776,, +86.85,,,,,0.0178,0.11399 +90,,,5.534,,, +96.85,,,,,0.0169,0.11163 +100,,,8.431,,, +106.85,,,,,0.0161,0.1093 +110,,,12.495,,, +116.85,,,,,0.0152,0.107 +120,,,18.06,,0.015, +126.85,,,,,,0.1048 +136.85,,,,,,0.1026 +140,,,,,,0.1019 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/dodecane.csv b/fuellib/data/fuelData/propertiesData/dodecane.csv new file mode 100644 index 0000000..cb98737 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/dodecane.csv @@ -0,0 +1,33 @@ +Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,Cp,SurfaceTension,ThermalConductivity +C,g/cm^3,mm^2/s,kPa,Pa*s,J/mol/K,N/m,W/m/K +-9.55,0.77153,3.754358223,0.000626,0.0028966,359.85,0.0279,0.14393 +-3.15,,,,,,0.0274,0.14227 +0.45,0.76401,2.938704991,,0.0022452,364.29,, +6.85,,,0.00349,,,0.0265,0.13972 +10.45,0.75653,2.376244167,,0.0017977,369.15,, +16.85,,,,,,0.0256,0.13724 +20.45,0.7491,1.970497931,,0.0014761,374.36,, +26.85,,,0.0208,,,0.0248,0.13482 +30.45,0.7417,1.667520561,,0.0012368,379.87,0.0239,0.13245 +40.45,0.73431,1.43495254,,0.0010537,385.64,, +46.85,,,0.0947,,,0.023,0.13014 +50.45,0.72692,1.252187311,,0.00091024,391.64,, +56.85,,,,,,0.0221,0.12786 +60.45,0.71953,1.105680097,,0.00079557,397.82,, +66.85,,,0.346,,,0.0212,0.12562 +70.45,0.71212,0.986210189,,0.0007023,404.16,, +76.85,,,,,,0.0203,0.12343 +80.45,0.70468,0.887296361,,0.00062526,410.63,, +86.85,,,1.056,,,0.0194,0.12126 +90.45,0.69719,0.804285776,,0.00056074,417.21,, +96.85,,,,,,0.0185,0.11912 +100.45,0.68966,0.733723864,,0.00050602,423.89,, +106.85,,,2.783,,,0.0177,0.11701 +110.45,,,,,,, +116.85,,,,,,0.0168,0.11492 +120.45,,,,,,, +126.85,,,6.489,,,0.0159,0.11286 +130.45,,,,,,, +136.85,,,,,,0.0151,0.11081 +140,,,10.7,,,0.0148,0.11017 +140.45,,,,,,, \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/hefa-S1.csv b/fuellib/data/fuelData/propertiesData/hefa-S1.csv new file mode 100755 index 0000000..de03193 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/hefa-S1.csv @@ -0,0 +1,20 @@ +Temperature,Density,VaporPressure,Viscosity +C,g/cm^3,kPa,mm^2/s +-50,,, +-40,0.78008,,5.0983 +-30,0.77194,,3.7544 +-20,0.76433,0.37,2.876 +-10,0.75689,0.96,2.2514 +0,0.7494,1.43,1.7466 +10,0.74217,1.76,1.4599 +20,0.73444,2.12,1.2459 +30,0.72726,2.57,1.1493 +40,,3.25, +50,,4.06, +60,,5.19, +70,,6.93, +80,,9.32, +90,,12.61, +100,,17.16, +110,,23.13, +120,,31.29, \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/hefa-WE-SAF-262714.csv b/fuellib/data/fuelData/propertiesData/hefa-WE-SAF-262714.csv new file mode 100644 index 0000000..0663f97 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/hefa-WE-SAF-262714.csv @@ -0,0 +1,20 @@ +Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity +C,g/cm^3,kPa,mm^2/s,N/m,W/m/K +-50,0.79867,,17.745,, +-40,0.7901,,8.1981,, +-30,0.78225,,5.6559,, +-20,0.77441,0.37,4.1397,, +-10,0.76662,0.96,3.1371,, +0,0.75716,1.43,2.4042,, +10,0.74983,1.76,1.9633,, +20,0.74467,2.12,1.6429,, +30,0.73974,2.57,1.4027,, +40,0.73245,3.25,1.2165,, +50,0.72533,4.06,1.0669,, +60,,5.19,1.0202,, +70,,6.93,,, +80,,9.32,,, +90,,12.61,,, +100,,17.16,,, +110,,23.13,,, +120,,31.29,,, \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/hefa-jet-a-blends.csv b/fuellib/data/fuelData/propertiesData/hefa-jet-a-blends.csv new file mode 100644 index 0000000..fb759c6 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/hefa-jet-a-blends.csv @@ -0,0 +1,10 @@ +HEFA_concentration,Viscosity_TALL,Viscosity_CAME,Viscosity_MFAT,Density_TALL,Density_CAME,Density_MFAT +wt percentage,mm2/s at -20 C,mm2/s at -20 C,mm2/s at -20 C,g/cm3 at 15 C,g/cm3 at 15 C,g/cm3 at 15 C +0,3.781578947,3.781578947,3.781578947,0.8057,0.8057,0.8057 +10,3.889473684,3.884210526,3.947368421,0.8009,0.8012,0.8007 +20,3.963157895,3.989473684,4.097368421,0.7961,0.7966,0.7966 +30,4.05,4.118421053,4.247368421,0.7904,0.7922,0.7924 +40,4.165789474,4.226315789,4.431578947,0.7861,0.7874,0.7877 +50,4.276315789,4.365789474,4.581578947,0.7814,0.7828,0.7834 +60,4.394736842,4.513157895,4.781578947,0.7769,0.7783,0.779 +100,4.973684211,5.2,5.618421053,0.7573,0.7598,0.7612 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/heptane.csv b/fuellib/data/fuelData/propertiesData/heptane.csv new file mode 100644 index 0000000..45d575b --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/heptane.csv @@ -0,0 +1,39 @@ +Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,SurfaceTension,ThermalConductivity +C,g/cm^3,mm^2/s,kPa,Pa*s,N/m,W/m/K +-60,0.75019,1.937642464,,0.0014536,, +-50,0.74191,1.570136539,,0.0011649,, +-40,0.73366,1.307472126,,0.00095924,, +-30,0.72543,1.111933612,,0.00080663,, +-20,0.71718,0.961571711,0.39,0.00068962,, +-10,0.70892,0.842859561,0.644,0.00059752,, +-9.55,,,,,0.0237,0.14005 +-3.15,,,,,0.023,0.13843 +0,0.70062,0.747109703,1.25,0.00052344,, +6.85,,,,,0.022,0.13588 +10,0.69226,0.668491607,2.293,0.00046277,, +16.85,,,,,0.0209,0.13331 +20,0.68385,0.602895372,4,0.00041229,, +26.85,,,,,0.0198,0.13075 +30,0.67534,0.547457577,6.67,0.00036972,, +36.85,,,,,0.0188,0.1282 +40,0.66674,0.500044995,10.7,0.0003334,, +46.85,,,,,0.0178,0.12567 +50,0.65803,0.459082413,16.56,0.00030209,, +56.85,,,,,0.0167,0.12316 +60,0.64918,0.423349456,24.83,0.00027483,, +66.85,,,,,0.0157,0.12068 +70,,,36.18,,, +76.85,,,,,0.0148,0.11823 +80,,,51.37,,, +86.85,,,,,0.0138,0.11581 +90,,,71.28,,, +96.85,,,,,0.0128,0.11342 +100,,,96.84,,, +106.85,,,,,0.0119,0.11107 +110,,,129.1,,, +116.85,,,,,0.011,0.10873 +120,,,169.2,,, +126.85,,,,,0.01,0.10643 +130,,,,,, +136.85,,,,,0.00915,0.10414 +140,,,,,0.00888,0.10342 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/posf10264.csv b/fuellib/data/fuelData/propertiesData/posf10264.csv new file mode 100644 index 0000000..b8b99df --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/posf10264.csv @@ -0,0 +1,22 @@ +Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity +C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K +-40,0.822975,,6.6,,, +-20,0.8086,,3.5,,, +-10,,,,0.025842439,,2.018461485 +0,0.794225,0.04835033,,,0.129038462,2.047461358 +10,,,,,,2.07898547 +20,0.77985,0.628554285,,0.023836238,,2.11025023 +30,,,,,0.124038462,2.13774594 +40,0.765283333,1.402159558,1.14,0.022833667,0.12,2.18032366 +50,,,,,,2.21013612 +60,,3.432873401,,,0.116153846,2.24866239 +70,,,,,,2.28799548 +80,,7.397600428,,,,2.32905174 +90,,,,,,2.36824652 +100,,14.60179954,0.61,,,2.4095333 +110,,,,,,2.44825551 +120,,26.59268128,,,,2.48820526 +130,,,,,,2.52931339 +140,,,,,,2.56860038 +150,,,,,,2.60919559 +160,,,,,,2.66087899 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/posf10289.csv b/fuellib/data/fuelData/propertiesData/posf10289.csv new file mode 100644 index 0000000..00f5515 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/posf10289.csv @@ -0,0 +1,24 @@ +Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity +C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K +-40,,,14.1,,, +-20,,,6.5,,, +-10,,,,0.02842143,,1.809232472 +0,0.838691667,0.04835033,,,,1.850945723 +10,,,,,,1.888953307 +20,0.823933333,0.338452307,,0.025727511,,1.920644544 +30,,,,,0.117980769,1.95028412 +40,0.80975,0.435152966,1.57,0.024724939,,1.988591385 +50,,,,,,2.017821782 +60,,1.305458899,,,,2.060491707 +70,,,,,,2.087007688 +75,,,,,0.108942308, +80,,3.336172742,,,,2.131216358 +90,,,,,,2.168711027 +100,,6.382243506,0.76,,,2.21016494 +110,,,,,,2.250350972 +120,,13.77984393,,,,2.288128033 +125,,,,,0.100865385, +130,,,,,,2.328342881 +140,,,,,,2.369145564 +150,,,,,,2.409671619 +160,,,,,,2.45891723 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/posf10325.csv b/fuellib/data/fuelData/propertiesData/posf10325.csv new file mode 100644 index 0000000..8b40e31 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/posf10325.csv @@ -0,0 +1,22 @@ +Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity +C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K +-40,0.843866667,,9.2,,, +-20,0.829683333,,4.5,,, +-10,,,,0.028028403,,1.88954449 +0,0.815116667,0.04835033,,,0.124230769,1.9302667 +10,,,,,,1.96006123 +20,0.8017,0.435152966,,0.024818739,0.120192308,1.98830303 +30,,,,,,2.02902524 +40,0.787325,0.821955603,1.31,0.023619632,0.116057692,2.06817277 +50,,,,,,2.11045502 +60,,2.272465491,,,0.112211538,2.14960987 +70,,,,,,2.19033207 +80,,4.931733619,,,,2.22012661 +90,,,,,,2.2514812 +100,,9.863467237,0.68,,,2.29063604 +120,,18.75992788,,,,2.32043789 +130,,,,,,2.3705204 +140,,,,,,2.41279534 +150,,,,,,2.4519575 +160,,,,,,2.49110503 +,,,,,,2.54118754 \ No newline at end of file diff --git a/fuellib/data/fuelData/propertiesData/posf11498.csv b/fuellib/data/fuelData/propertiesData/posf11498.csv new file mode 100755 index 0000000..f492040 --- /dev/null +++ b/fuellib/data/fuelData/propertiesData/posf11498.csv @@ -0,0 +1,22 @@ +Temperature,Density,VaporPressure,Viscosity +C,g/cm^3,kPa,mm^2/s +-39.78658537,,,10.41126684 +-20.15243902,,,4.996496178 +0,,0.029250391, +4.926624738,0.766266145,, +14.98951782,0.759216842,, +19.74128847,,0.10137713, +25.09146341,,,1.914179104 +25.26205451,0.751886646,, +35.11530398,0.744838516,, +39.69930983,,0.144264166, +40.0304878,,,1.535971059 +44.96855346,0.737790386,, +54.82180294,0.729903095,, +59.66534646,,0.36989935, +64.88469602,0.722294351,, +74.9475891,0.715245048,, +79.41849753,,0.741743738, +85.01048218,0.707356585,, +99.40473264,,1.427904253, +119.4195021,,2.764648172, \ No newline at end of file diff --git a/fuellib/data/fuelData/refCompounds.csv b/fuellib/data/fuelData/refCompounds.csv new file mode 100644 index 0000000..61e8d64 --- /dev/null +++ b/fuellib/data/fuelData/refCompounds.csv @@ -0,0 +1,90 @@ +GCxGC Bin,Formula,Reference Compound,PelePhysics Key +Toluene,C7H8,toluene,C6H5CH3 +C2-Benzene,C8H10,ethyl benzene ,C6H5C2H5 +C3-Benzene,C9H12,propyl benzene,C6H5C3H7 +C4-Benzene,C10H14,butyl benzene,C6H5C4H9 +C5-Benzene,C11H16,pentyl benzene,C6H5C5H11 +C6-Benzene,C12H18,hexyl benzene,C6H5C6H13 +C7-Benzene,C13H20,heptyl benzene,C6H5C7H15 +C8-Benzene,C14H22,octyl benzene,C6H5C8H17 +C9-Benzene,C15H24,nonyl benzene,C6H5C9H19 +C10-Benzene,C16H26,decyl benzene,C6H5C10H21 +Diaromatic-C10,C10H8,naphthalene,NAPH +Diaromatic-C11,C11H10,1-methyl naphthalene,METHYLNAPH-1 +Diaromatic-C12,C12H12,1-ethyl naphthalene,ETHYLNAPH-1 +Diaromatic-C13,C13H14,1-propyl naphthalene,PROPYLNAPH-1 +Diaromatic-C14,C14H16,1-butyl naphthalene,BUTYLNAPH-1 +Cycloaromatic-C09,C9H10,indane,INDANE +Cycloaromatic-C10,C10H12,tetralin,TETRA +Cycloaromatic-C11,C11H14,2-methyl tetralin,METHYLTETRA-2 +Cycloaromatic-C12,C12H16,2-ethly tetralin,ETHYLTETRA-2 +Cycloaromatic-C13,C13H18,2-propyl tetralin,PROPYLTETRA-2 +Cycloaromatic-C14,C14H20,2-butyl tetralin,BUTYLTETRA-2 +Cycloaromatic-C15,C15H22,2-pentyl tetralin,PENTYLTETRA-2 +C07-Isoparaffin,C7H16,2-methyl hexane,C7H16-2 +C08-Isoparaffin,C8H18,2-methyl heptane,C8H18-2 +C09-Isoparaffin,C9H20,2-methyl octane,C9H20-2 +C10-Isoparaffin,C10H22,2-methyl nonane,C10H22-2 +C11-Isoparaffin,C11H24,2-methyl decane,C11H24-2 +C12-Isoparaffin,C12H26,2-methyl undecane,C12H26-2 +C13-Isoparaffin,C13H28,2-methyl dodecane,C13H28-2 +C14-Isoparaffin,C14H30,2-methyl tridecane,C14H30-2 +C15-Isoparaffin,C15H32,2-methyl tetradecane,C15H32-2 +C16-Isoparaffin,C16H34,2-methyl pentadecane,C16H34-2 +C17-Isoparaffin,C17H36,2-methyl hexadecane,C17H36-2 +C18-Isoparaffin,C18H38,2-methyl heptadecane,C18H38-2 +C19-Isoparaffin,C19H40,2-methyl octadecane,C19H40-2 +C20-Isoparaffin,C20H42,2-methyl nonadecane,C20H42-2 +C21-Isoparaffin,C21H44,2-methyl icosane,C21H44-2 +C22-Isoparaffin,C22H46,2-methyl henicosane,C22H46-2 +C23-Isoparaffin,C23H48,2-methyl docosane,C23H48-2 +C24-Isoparaffin,C24H50,2-methyl tricosane,C24H50-2 +n-C07,C7H16,n-heptane,NC7H16 +n-C08,C8H18,n-octane,NC8H18 +n-C09,C9H20,n-nonane,NC9H20 +n-C10,C10H22,n-decane,NC10H22 +n-C11,C11H24,n-undecane,NC11H24 +n-C12,C12H26,n-dodecane,NC12H26 +n-C13,C13H28,n-tridecane,NC13H28 +n-C14,C14H30,n-tetradecane,NC14H30 +n-C15,C15H32,n-pentadecane,NC15H32 +n-C16,C16H34,n-hexadecane,NC16H34 +n-C17,C17H36,n-heptadecane,NC17H36 +n-C18,C18H38,n-octadecane,NC18H38 +n-C19,C19H40,n-nonadecane,NC19H40 +n-C20,C20H42,n-icosane,NC20H42 +n-C21,C21H44,n-henicosane,NC21H44 +n-C22,C22H46,n-docosane,NC22H46 +n-C23,C23H48,n-tricosane,NC23H48 +C07-Monocycloparaffin,C7C14,methyl cyclohexane,C6H11CH3 +C08-Monocycloparaffin,C8H16,ethyl cyclohexane,C6H11C2H5 +C09-Monocycloparaffin,C9H18,propyl cyclohexane,C6H11C3H7 +C10-Monocycloparaffin,C10H20,butyl cyclohexane,C6H11C4H9 +C11-Monocycloparaffin,C11H22,pentyl cyclohexane,C6H11C5H11 +C12-Monocycloparaffin,C12H24,hexyl cyclohexane,C6H11C6H13 +C13-Monocycloparaffin,C13H26,heptyl cyclohexane,C6H11C7H15 +C14-Monocycloparaffin,C14H28,octyl cyclohexane,C6H11C8H17 +C15-Monocycloparaffin,C15H30,nonyl cyclohexane,C6H11C9H19 +C16-Monocycloparaffin,C16H32,decyl cyclohexane,C6H11C10H21 +C17-Monocycloparaffin,C17H34,undecyl cyclohexane,C6H11C11H23 +C18-Monocycloparaffin,C18H36,dodecyl cyclohexane,C6H11C12H25 +C19-Monocycloparaffin,C19H38,tridecyl cyclohexane,C6H11C13H27 +C08-Dicycloparaffin,C8H14,Octahydropentalene,OHPEN +C09-Dicycloparaffin,C9H16,Hydrindane,HYDRIND +C10-Dicycloparaffin,C10H18,Decalin,DECALIN +C11-Dicycloparaffin,C11H20,2-methyldecalin,METHYLDECALIN-2 +C12-Dicycloparaffin,C12H22,2-ethyldecalin,ETHYLDECALIN-2 +C13-Dicycloparaffin,C13H24,2-propyldecalin,PROPYLDECALIN-2 +C14-Dicycloparaffin,C14H26,2-butyldecalin,BUTYLDECALIN-2 +C15-Dicycloparaffin,C15H28,2-pentyldecalin,PENTYLDECALIN-2 +C16-Dicycloparaffin,C16H30,2-hexyldecalin,HEXYLDECALIN-2 +C17-Dicycloparaffin,C17H32,2-heptyldecalin,HEPTYLDECALIN-2 +C10-Tricycloparaffin,C10H16,C1CC2C(C1)C1CCCC21,TRICYCLO-C10 +C11-Tricycloparaffin,C11H18,C1CC2CC3CCCC3C2C1,TRICYCLO-C11 +C12-Tricycloparaffin,C12H20,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12 +C13-Tricycloparaffin,C13H22,C1CCC2C(C1)CC1CCCCC12,TRICYCLO-C13 +C14-Tricycloparaffin,C13H22,C1CCC2CC3CCCCC3CC2C1,TRICYCLO-C14 +C10-Alkene,C10H20,1-decene,DECENE-1 +C12-Alkene,C12H24,1-dodecene,DODECENE-1 +C14-Alkene,C14H28,1-tetradecene,TETRADECENE-1 +C16-Alkene,C16H32,1-hexadecene,HEXADECENE-1 \ No newline at end of file diff --git a/fuellib/data/gcmTableData/__init__.py b/fuellib/data/gcmTableData/__init__.py new file mode 100644 index 0000000..7fa9dc1 --- /dev/null +++ b/fuellib/data/gcmTableData/__init__.py @@ -0,0 +1 @@ +"""GCM table data.""" diff --git a/fuellib/data/gcmTableData/gcmTable.csv b/fuellib/data/gcmTableData/gcmTable.csv new file mode 100644 index 0000000..997d23d --- /dev/null +++ b/fuellib/data/gcmTableData/gcmTable.csv @@ -0,0 +1,15 @@ +Property,Units,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" +tck,K,1.6781,3.492,4.033,4.8823,5.0146,7.3691,6.5081,8.9582,11.3764,9.9318,3.7337,14.6409,8.213,10.3239,10.4664,9.7292,25.9145,13.2896,14.6273,10.1986,12.5965,13.8116,11.6057,6.4737,6.0723,5.0663,9.5059,12.1726,10.2075,9.8544,10.4677,7.2121,7.6924,5.5172,28.757,29.1528,27.9464,20.3781,23.7593,11.0752,10.8632,11.3959,16.3945,0,18.5875,14.1565,24.7369,23.205,34.587,13.8058,17.3947,10.5371,7.5433,11.4501,5.4334,2.8977,0,2.4778,1.7399,3.5192,12.1084,9.8408,0,4.8923,1.5974,65.1053,0,0,36.1403,0,0,17.9668,0,14.3969,17.7916,0,0,0,-0.5334,-0.5143,1.0699,1.9886,5.8254,-2.3305,-1.2978,-0.6785,0.8479,3.6714,0.4402,0.0167,-0.5231,-0.385,2.116,2.0427,-1.5826,0.2996,0.5018,2.9571,1.1696,-1.7493,6.1279,-1.3406,2.5413,-2.7617,-3.4235,-2.8035,-3.5442,5.4941,0.3233,5.4864,2.0699,2.1345,1.0159,-5.3307,4.4847,-0.4996,-1.9334,0,-2.2974,2.8907,0 +pck,bar^(-1/2),0.0199,0.0106,0.0013,-0.0104,0.025,0.0179,0.0223,0.0126,0.002,0.0313,0.0075,0.0021,0.0194,0.0122,0.0028,0.0051,-0.0074,0.0251,0.0178,0.0141,0.029,0.0218,0.0138,0.0204,0.0151,0.0099,0.009,0.0126,0.0107,0.0126,0.0104,-0.0005,0.0159,0.0049,0.0011,0.0296,0.0257,0.0361,0.0115,0.0198,0.0114,0.0031,0.0268,0,0.0349,0.0131,0.021,0.0122,0.015,0.0136,0.0028,-0.0018,0.0148,0.0041,0.016,0.013,0,0.0442,0.0129,0.0047,0.0113,0.0354,0,0.039,0.0144,0.0043,0,0,0.0401,0,0,0.0254,0,0.016,0.0111,0,0,0,0.000488,0.00141,-0.00185,-0.0052,-0.01323,0.003714,0.001171,0.000424,0.002257,-0.0098,0.004186,-0.00018,0.003538,0.005675,-0.00255,0.005175,0.003659,0.001474,-0.0023,0.003818,-0.00248,0.00492,0.000344,0.000659,0.001067,-0.00488,-0.00054,-0.00439,0.000178,0.005052,0.006917,0.001408,0.002148,-0.00595,-0.00088,-0.00225,0,0.000319,0,0,0.009027,0.008247,0 +vck,m^3/kmol,0.075,0.0558,0.0315,-0.0003,0.1165,0.0954,0.0918,0.0733,0.0762,0.1483,0.0422,0.0398,0.1036,0.101,0.0712,0.039,0.0316,0.134,0.1119,0.0863,0.1589,0.1365,0.1056,0.0875,0.0729,0.0587,0.0686,0.1313,0.0753,0.1215,0.0996,0.0916,0.126,0.067,0.0636,0.2483,0.1703,0.1583,0.1019,0.1156,0.1035,0.0792,0.1695,0,0.2103,0.1016,0.1653,0.1423,0.1426,0.1025,0.1081,0.0828,0.0933,0.0763,0.0569,0.0567,0,0.1148,0.0952,0,0.0859,0.1821,0,0.1475,0.0378,0.1443,0,0,0.2503,0,0,0.1675,0,0.1302,0.1165,0,0,0,0.004,0.00572,-0.00398,-0.01081,-0.023,-0.00014,-0.00851,-0.00866,0.01636,-0.027,-0.00781,-0.00098,0.00281,0.00826,-0.01755,0.00227,-0.00664,-0.0051,-0.00122,-0.01966,0.00664,0.00559,-0.00415,-0.00293,-0.00591,-0.00144,0.02605,-0.00777,0.01511,0.00397,-0.02297,0.00433,0.0058,-0.0138,0.00297,-0.00045,0,-0.00596,0.0051,0,-0.00832,-0.00341,0 +tbk,K,0.8894,0.9225,0.6033,0.2878,1.7827,1.8433,1.7117,1.7957,1.8881,3.1243,0.9297,1.6254,1.9669,1.9478,1.7444,3.2152,4.4014,3.5668,3.8967,2.8526,3.636,3.3953,3.1459,2.2536,1.6249,1.1557,2.5892,3.1656,2.5983,3.1376,2.6127,1.578,2.1647,1.2171,5.4736,6.28,5.9234,5.0525,5.8337,2.9637,2.6948,2.2073,3.93,3.56,4.5797,2.6293,5.7619,5.0767,6.0837,3.2914,3.665,2.6495,2.3678,2.5645,1.7824,0.9442,7.2644,1.288,0.6115,1.1739,2.6446,2.8881,2.3086,1.9163,1.0081,10.3428,0,0,7.6904,0,6.7822,5.5566,5.4248,3.6796,3.6763,2.6812,5.7093,5.826,-0.1157,-0.0489,0.1798,0.3189,0.7273,0.4745,0.3563,0.1919,0.1957,0.3489,0.1589,0.0668,-0.1406,-0.09,0.0511,0.6884,-0.1074,0.0224,0.092,0.558,0.0735,-0.1552,0.7801,-0.2383,0.4456,-0.1977,0.0835,-0.5385,-0.6331,1.4108,-0.069,1.0682,0.4247,0.2499,0.1134,-0.2596,0.4408,-0.1168,-0.3201,-0.4453,-0.6776,-0.3678,0 +tmk,K,0.464,0.9246,0.3557,1.6479,1.6472,1.6322,1.7899,2.0018,5.1175,3.3439,1.4669,0.2098,1.8635,0.4177,-1.7567,3.5979,13.7349,4.8776,5.6622,4.2927,4.0823,3.5572,4.225,2.9248,2.0695,4.0352,4.5047,6.7684,4.1187,4.5341,6.0609,3.41,4.058,0.9544,10.1031,0,12.6275,4.1859,11.563,3.3376,2.9933,9.8409,5.1638,0,10.2337,2.7336,5.5424,4.9738,8.4724,3.0044,4.6089,3.7442,3.9106,9.5793,1.5598,2.5015,0,3.2411,0,0,3.4448,7.4756,0,2.7523,1.9623,31.2786,0,0,11.377,0,0,0,0,5.0506,3.1468,0,0,0,0.0381,-0.2355,0.4401,-0.4923,6.065,1.3772,0,0.6824,1.5656,6.9709,1.9913,0.2476,-0.587,-0.2361,-2.8298,1.488,2.0547,-0.2951,-0.2986,0.7143,-0.6697,-3.1034,28.4324,0.4838,0.0127,-2.3598,-2.0198,-0.548,0.3189,0.9124,9.5209,2.7826,2.5114,1.0729,0.2476,0.1175,-0.2914,-0.0514,-1.6425,0,2.5832,-1.5511,0 +hfk,kJ/mol,-45.947,-20.763,-3.766,17.119,53.712,69.939,64.145,82.528,104.293,197.322,11.189,27.016,-19.243,9.404,27.671,-181.422,-164.609,-182.329,-164.41,-129.158,-389.737,-359.258,-332.822,-163.569,-151.143,-129.488,-140.313,-15.505,3.32,5.432,23.101,26.718,54.929,69.885,20.079,134.062,139.758,88.298,-396.242,-73.568,-63.795,-57.795,-82.921,0,-107.188,-16.752,-66.138,-59.142,-7.365,-8.253,57.546,1.834,220.803,227.368,-36.097,-161.74,0,-679.195,0,0,-313.545,-258.96,0,-446.835,-223.398,-203.188,-67.778,-182.096,-189.888,-46.562,0,-344.125,0,-2.084,18.022,0,0,0,-0.86,-1.338,6.771,7.205,14.271,104.8,99.455,13.782,-9.66,15.465,-8.392,0.474,1.472,4.504,1.252,-2.792,-2.092,0.975,4.753,14.145,-3.173,1.279,12.245,-7.807,37.462,-16.097,-9.874,-3.887,-24.125,0.366,-16.333,-2.992,2.855,0.351,-8.644,1.532,-0.329,0,11.989,0,12.285,11.207,11.74 +gfk,kJ/mol,-8.03,8.231,19.848,37.977,84.926,92.9,88.402,93.745,116.613,221.308,22.533,30.485,22.505,41.228,52.948,-158.589,-132.097,-131.366,-132.386,-107.858,-318.616,-291.188,-288.902,-105.767,-101.563,-92.099,-90.883,58.085,63.051,82.471,95.888,85.001,128.602,132.756,68.861,199.958,199.288,121.544,-349.439,-33.373,-31.502,-25.261,-35.814,0,-53.332,-0.596,17.963,18.088,60.161,16.731,46.945,-1.721,217.003,216.328,-28.148,-144.549,0,-626.58,0,0,-281.495,-209.337,0,-392.975,-212.718,-136.742,0,0,-65.642,0,0,-241.373,0,30.222,38.346,0,0,0,0.297,-0.399,6.342,7.466,16.224,94.564,92.573,5.733,-8.18,20.597,-5.505,0.95,0.699,1.013,1.041,-1.062,-1.359,0.075,0,23.539,-2.602,2.149,10.715,-6.208,29.181,-12.809,-7.415,-6.77,-20.77,3.805,-5.487,-1.6,1.858,8.846,-13.167,-0.654,-2.091,0,12.373,0,14.161,12.53,0 +hvk,KJ/mol,4.116,4.65,2.771,1.284,6.714,7.37,6.797,8.178,9.342,12.318,4.098,12.552,9.776,10.185,8.834,24.529,40.246,18.999,20.041,12.909,22.709,17.759,0,10.919,7.478,5.708,11.227,14.599,11.876,14.452,14.481,0,6.947,6.918,28.453,31.523,31.005,23.34,43.046,13.78,11.985,9.818,19.208,17.574,0,11.883,30.644,26.277,0,14.931,14.364,11.423,7.751,11.549,0,4.877,0,8.901,1.86,8.901,0,13.322,0,8.301,0,0,0,51.787,0,0,0,0,0,16.921,17.117,13.265,27.966,0,0.292,-0.72,0.868,1.027,2.426,0,0,-0.568,-0.905,-0.847,2.057,-0.073,-0.369,0.345,-0.114,0,0.207,-0.668,0.071,0.744,-3.41,0,8.502,-3.345,0,1.517,0,-1.398,0.32,-3.661,4.626,0,0,2.311,0,0,0.972,0,0,0,-7.488,-4.864,0 +wk,1,0.296,0.147,-0.071,-0.351,0.408,0.252,0.223,0.235,-0.21,0.152,0.027,0.334,0.146,-0.088,1.524,0.737,1.015,0.633,0.963,1.133,0.756,0.765,0.526,0.442,0.218,0.509,0.8,0,0.953,0.55,0.386,0.384,0.075,0.793,0,0,0,1.67,0.57,0,0,0.716,0,0.617,0,0.296,0,0,0,0,0.233,0.278,0.618,0,0,0.263,0.5,0,0,0,0,0.503,0,0.547,0,0,0,0,0,0,0,0.428,0,0,0.438,0.739,0,0,0.0174,0.01922,-0.00475,-0.02883,-0.08632,0.17563,0.22216,0.16284,-0.03065,-0.02094,0.01648,0.00619,-0.0115,0.02778,-0.11024,-0.1124,0,-0.20789,-0.16571,0,0,0.08774,0,-0.26623,0,0.91939,0,0.03654,0.21106,0,0,0,0,-0.13106,0,0,-0.01509,0,0,0,-0.03078,0.00001,0 +vmk,m^3/kmol,0.0261,0.0164,0.0071,-0.0038,0.0373,0.0269,0.027,0.0161,0.003,0.0434,0.0132,0.0044,0.0289,0.0192,0.0099,0.0055,0.0113,0.0365,0.0282,0.02,0.045,0.0357,0.0267,0.0327,0.0231,0.018,0.0206,0.0265,0.0195,0.0267,0.0232,0.0181,0.0191,0.0168,0.0137,0.0608,0.0524,0.0331,0.0223,0.0337,0.0266,0.0202,0.0468,0.062,0,0.0241,0.0338,0.0262,0.025,0.0345,0.0279,0.0214,0,0.0145,0.0153,0.0173,0,0,0,0,0.0192,0.0538,0,0.0538,0,0,0,0,0.0548,0,0,0.041,0,0.0348,0.0273,0,0,0,0.00133,0.00179,-0.00203,-0.00243,-0.00744,0,0,0.00213,0.00063,-0.00519,-0.00188,0.00009,0.00012,0.00142,-0.00107,0,-0.00009,-0.0003,-0.00108,-0.00111,-0.00036,-0.0005,0.00777,0.00083,0.00036,0.00198,0.00001,-0.00092,0.00175,0.00235,-0.0025,0.00046,0,-0.00179,-0.00206,0.01203,-0.00023,0,0,0,0.00178,0.00171,0 +CpAk,J/mol/K,35.1152,22.6346,8.9272,0.3456,49.2506,35.2248,37.6299,21.3528,10.2797,66.0574,16.3794,10.4283,42.8569,32.8206,19.9504,27.2107,39.7712,59.3032,0,40.7501,66.8423,0,51.5048,50.5604,39.5784,25.675,0,57.6861,44.1122,53.7012,44.6388,0,41.4064,30.1561,47.1311,84.7602,0,58.2837,46.5577,48.4648,36.5885,29.1848,60.8262,56.1685,78.6054,33.645,63.7851,51.1442,0,58.2445,29.1815,28.026,45.9768,26.7371,25.8094,30.1696,0,63.2024,44.3567,0,0,0,0,0,22.2082,0,0,0,0,0,0,0,0,57.767,45.0314,40.5275,80.301,0,0.583,0.3226,0.9668,-0.3082,-0.1201,8.5546,3.1721,-5.906,-3.9682,-3.2746,2.6142,-1.3913,0.263,6.5145,4.1707,0,0,3.7978,0,0,0,0,-15.7667,0,0,-6.4072,0,2.4484,-1.5252,0,0,0,0,0,0,0,-2.7407,0,-1.6978,0,-2.2923,-0.3162,0 +CpBk,J/mol/K,39.5923,45.0933,59.9786,74.0368,59.384,62.1924,62.1285,66.3947,65.5372,69.3936,32.7433,25.3634,65.6464,70.4153,81.8764,2.7609,35.5676,67.8149,0,19.699,102.4553,0,44.4133,38.9681,41.8177,24.7281,0,64.0768,77.2155,71.7948,68.5041,0,85.0996,81.6814,51.3326,177.2513,0,49.6388,48.2322,37.237,47.6004,52.3817,41.9908,46.9337,32.1318,23.2759,83.4744,94.2934,0,46.9958,-9.7846,-7.1651,20.6417,21.7676,-5.2241,26.9738,0,51.9366,44.5875,0,0,0,0,0,-2.8385,0,0,0,0,0,0,0,0,44.1238,55.1432,55.0141,132.7786,0,-1.2002,2.1309,-2.0762,1.8969,4.2846,-22.9771,-10.0834,-1.871,17.7889,32.167,4.4511,-1.5496,-2.3428,-17.5541,-3.1964,0,0,-7.3251,0,0,0,0,-0.1174,0,0,15.2583,0,-0.0765,-7.638,0,0,0,0,0,0,0,11.1033,0,1.0477,0,3.1142,2.3711,0 +CpCk,J/mol/K,-9.9232,-15.7033,-29.5143,-45.7878,-21.7908,-24.8156,-26.0637,-29.3703,-30.6057,-25.1081,-13.1692,-12.7283,-21.067,-28.9361,-40.2864,1.306,-15.5875,-20.9948,0,-5.436,-43.3306,0,-19.6155,-4.7799,-11.0837,4.2419,0,-21.048,-33.5086,-22.9685,-26.7106,0,-35.6318,-36.1441,-25.0276,-72.3213,0,-15.6291,-20.4868,-13.0635,-22.8148,-30.8526,-20.4091,-31.3325,-19.4033,-12.2406,-35.1171,-45.2029,0,-10.5106,3.4554,2.4332,-8.3297,-6.4481,1.4542,-13.3722,0,-28.6308,-23.282,0,0,0,0,0,1.2679,0,0,0,0,0,0,0,0,-9.5565,-18.7776,-31.719,-58.3241,0,-0.0584,-1.5728,0.3148,-1.6454,-2.0262,10.7278,4.9674,4.2945,-3.3639,-17.8246,-5.9808,2.5899,0.8975,10.6977,-1.1997,0,0,2.5312,0,0,0,0,6.1191,0,0,-8.3149,0,0.146,8.1795,0,0,0,0,0,0,0,-11.0878,0,0.2002,0,-1.4995,-1.4825,-0.0584 +MW,g/mol,15,14,13,12,27,26,26,25,24,39,13,12,27,26,25,17,29,43,42,41,59,58,45,31,30,29,49,30,29,30,29,28,29,28,28,78,77,40,45,49.5,48.5,47.5,84,119.5,118.5,47.5,60,59,58,47,35.5,80,25,24,59.5,31,71,69,50,31,44,102,67.5,85.5,0,44,58,57,72,0,70,61,60,47,46,45,83,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/exporters/__init__.py b/fuellib/exporters/__init__.py new file mode 100644 index 0000000..4762ce3 --- /dev/null +++ b/fuellib/exporters/__init__.py @@ -0,0 +1,9 @@ +""" +Export utilities for FuelLib. + +This module provides functions to export FuelLib data in various formats. +""" + +from . import converge, pele + +__all__ = ["converge", "pele"] diff --git a/source/Export4Converge.py b/fuellib/exporters/converge.py similarity index 92% rename from source/Export4Converge.py rename to fuellib/exporters/converge.py index d727c40..bc24a70 100644 --- a/source/Export4Converge.py +++ b/fuellib/exporters/converge.py @@ -1,15 +1,11 @@ import os -import sys import numpy as np import pandas as pd import argparse -import FuelLib as fl +import fuellib as fl -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * +# Default data directory - use fuellib's embedded data +FUELDATA_DIR = fl.get_fueldata_dir() """ Script that exports mixture properties over large temperature range for use in @@ -20,7 +16,7 @@ The file contains mixture properties for the fuel, formatted for Converge. Usage: - python Export4Converge.py --fuel_name + fl-export-converge --fuel_name Options: --units @@ -141,7 +137,7 @@ def create_data_dict( def export_converge( fuel, - path=os.path.join(FUELLIB_DIR, "exportData"), + path=None, units="mks", temp_min=0, temp_max=1000, @@ -155,7 +151,7 @@ def export_converge( :type fuel: fl.fuel :param path: Directory to save the input file. - :type path: str, optional (default: FuelLib/exportData) + :type path: str, optional (default: current directory/exportData) :param units: Units for the properties ("mks" for SI, "cgs" for CGS). :type units: str, optional (default: "mks") @@ -178,6 +174,9 @@ def export_converge( :raises ValueError: If input parameters are invalid :raises TypeError: If fuel object is not a FuelLib fuel instance """ + if path is None: + path = os.path.join(os.getcwd(), "exportData") + # Input validation if not hasattr(fuel, "compounds") or not hasattr(fuel, "Y_0"): raise TypeError("fuel parameter must be a valid FuelLib fuel object") @@ -507,30 +506,6 @@ def export_properties_to_csv(file_path, data_dict, overwrite=True): export_properties_to_csv(composition_file, composition_data) -def validate_fuel_files(fuel_name, fuel_data_dir): - """ - Validate that required fuel data files exist. - - :param fuel_name: Name of the fuel. - :type fuel_name: str - :param fuel_data_dir: Directory containing fuel data files. - :type fuel_data_dir: str - :raises FileNotFoundError: If required files are missing. - """ - gcxgc_file = os.path.join(fuel_data_dir, f"gcData/{fuel_name}_init.csv") - decomp_file = os.path.join(fuel_data_dir, f"groupDecompositionData/{fuel_name}.csv") - - if not os.path.exists(gcxgc_file): - raise FileNotFoundError(f"GCXGC file for {fuel_name} not found: {gcxgc_file}") - - if not os.path.exists(decomp_file): - raise FileNotFoundError( - f"Decomposition file for {fuel_name} not found: {decomp_file}" - ) - - print("All required files found.") - - def main(): """ Main function to execute the export process. @@ -554,7 +529,7 @@ def main(): :type --temp_step: float, optional (default: 10 K) :param --export_dir: Directory to export the properties. - :type --export_dir: str, optional (default: FuelLib/exportData) + :type --export_dir: str, optional (default: current directory/exportData) :param --export_mix: Whether to export individual component or mixture properties. :type --export_mix: bool, optional (default: False) @@ -569,63 +544,79 @@ def main(): # Mandatory argument for fuel name parser.add_argument( + "-f", "--fuel_name", required=True, + metavar="NAME", help="Name of the fuel (mandatory).", ) # Optional argument for fuel data directory parser.add_argument( + "-D", "--fuel_data_dir", default=FUELDATA_DIR, + metavar="PATH", help="Directory where fuel data files are located (optional, default: FuelLib/fuelData).", ) # Optional argument for units # Default is 'mks', but can be set to 'cgs' parser.add_argument( + "-u", "--units", default="mks", - help="Units for critical properties: mks or cgs (optional, default: mks).", + metavar="{mks,cgs}", + help="Units for critical properties (optional, default: mks).", ) # Optional argument for minimum temperature parser.add_argument( + "-t", "--temp_min", type=float, default=0, - help="Minimum temperature (K) for the property calculations (optional, default: 0).", + metavar="K", + help="Minimum temperature for property calculations (optional, default: 0).", ) # Optional argument for maximum temperature parser.add_argument( + "-T", "--temp_max", type=float, default=1000, - help="Maximum temperature (K) for the property calculations (optional, default: 1000).", + metavar="K", + help="Maximum temperature for property calculations (optional, default: 1000).", ) # Optional argument for temperature step size parser.add_argument( + "-s", "--temp_step", type=int, default=10, - help="Step size for temperature (K) (optional, default: 10).", + metavar="K", + help="Step size for temperature (optional, default: 10).", ) # Optional argument for export directory parser.add_argument( + "-o", "--export_dir", - default=os.path.join(FUELLIB_DIR, "exportData"), - help="Directory to export the properties (optional, default: FuelLib/exportData).", + default=os.path.join(os.getcwd(), "exportData"), + metavar="PATH", + help="Directory to export the properties (optional, default: ./exportData).", ) # Optional argument for exporting mixture properties parser.add_argument( + "-m", "--export_mix", type=lambda x: str(x).lower() in ["true", "1"], default=False, - help="Option to export mixture properties of the fuel (True or False, default: False).", + metavar="{true,false}", + help="Export mixture properties of the fuel (optional, default: false).", ) # Parse arguments diff --git a/source/Export4Pele.py b/fuellib/exporters/pele.py similarity index 95% rename from source/Export4Pele.py rename to fuellib/exporters/pele.py index 804838f..c209665 100644 --- a/source/Export4Pele.py +++ b/fuellib/exporters/pele.py @@ -1,17 +1,13 @@ import os -import sys import pandas as pd import argparse import subprocess from datetime import datetime from scipy import stats as st -import FuelLib as fl +import fuellib as fl -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * +# Default data directory - use fuellib's embedded data +FUELDATA_DIR = fl.get_fueldata_dir() """ Script that exports critical properties and initial mass fraction data @@ -23,7 +19,7 @@ the fuel, formatted for Pele. Usage: - python Export4Pele.py --fuel_name + fl-export-pele --fuel_name Options: --units @@ -246,7 +242,7 @@ def vec_to_str(vec): def export_pele( fuel, - path=os.path.join(FUELLIB_DIR, "exportData"), + path=None, units="mks", dep_fuel_names=None, use_pp_keys=True, @@ -262,7 +258,7 @@ def export_pele( :type fuel: fuel object :param path: Directory to save the input file. - :type path: str, optional (default: FuelLib/exportData) + :type path: str, optional (default: current directory/exportData) :param units: Units for the properties ("mks" for SI, "cgs" for CGS). :type units: str, optional (default: "mks") @@ -291,6 +287,9 @@ def export_pele( :raises ValueError: If input parameters are invalid :raises TypeError: If fuel object is not a FuelLib fuel instance """ + if path is None: + path = os.path.join(os.getcwd(), "exportData") + # Input validation if not hasattr(fuel, "compounds") or not hasattr(fuel, "Y_0"): raise TypeError("fuel parameter must be a valid FuelLib fuel object") @@ -535,7 +534,7 @@ def main(): :param --use_pp_keys: Use the PelePhysics key for each compound (True or False). Default is True. :type --use_pp_keys: bool, optional - :param --export_dir: Directory to export the properties. Default is "FuelLib/exportData". + :param --export_dir: Directory to export the properties. Default is "current directory/exportData". :type --export_dir: str, optional :param --export_mix: Option to export mixture properties of the fuel (True or False). Default is False. @@ -560,84 +559,106 @@ def main(): # Mandatory argument for fuel name parser.add_argument( + "-f", "--fuel_name", required=True, + metavar="NAME", help="Name of the fuel (mandatory).", ) # Optional argument for fuel data directory parser.add_argument( + "-D", "--fuel_data_dir", default=FUELDATA_DIR, + metavar="PATH", help="Directory where fuel data files are located (optional, default: FuelLib/fuelData).", ) # Optional argument for decomposition file name parser.add_argument( + "-c", "--fuel_decomp_name", default=None, + metavar="NAME", help="Name of the decomposition file (optional). If not provided, defaults to fuel_name.", ) # Optional argument for units # Default is 'mks', but can be set to 'cgs' parser.add_argument( + "-u", "--units", default="mks", - help="Units for critical properties: mks or cgs (optional, default: mks).", + metavar="{mks,cgs}", + help="Units for critical properties (optional, default: mks).", ) # Optional argument for deposition fuel names parser.add_argument( + "-d", "--dep_fuel_names", nargs="+", # Accepts one or more values default=None, + metavar="NAME", help="Space-separated list or single fuel that each compound deposits to (optional, default: fuel.compounds).", ) # Optional argument for using PelePhysics key parser.add_argument( + "-pp", "--use_pp_keys", type=lambda x: str(x).lower() in ["true", "1"], default=True, - help="Use the PelePhysics key for each compound (True or False, default: True).", + metavar="{true,false}", + help="Use PelePhysics keys for each compound (optional, default: true).", ) # Optional argument for export directory parser.add_argument( + "-o", "--export_dir", - default=os.path.join(FUELLIB_DIR, "exportData"), - help="Directory to export the properties (optional, default: FuelLib/exportData).", + default=os.path.join(os.getcwd(), "exportData"), + metavar="PATH", + help="Directory to export the properties (optional, default: ./exportData).", ) # Optional argument for exporting mixture properties parser.add_argument( + "-m", "--export_mix", type=lambda x: str(x).lower() in ["true", "1"], default=False, - help="Option to export mixture properties of the fuel (True or False, default: False).", + metavar="{true,false}", + help="Export mixture properties of the fuel (optional, default: false).", ) # Optional argument for mixture name if different than fuel_name parser.add_argument( + "-n", "--export_mix_name", default=None, + metavar="NAME", help="Name the mixture if different than fuel_name (optional, default: fuel_name).", ) # Optional argument for liquid property model parser.add_argument( + "-l", "--liq_prop_model", default="gcm", - help='Model for liquid properties: "gcm" (default) or "mp" (optional, default: gcm).', + metavar="{gcm,mp}", + help="Model for liquid properties (optional, default: gcm).", ) # Optional argument for printing Antoine coefficients in MP model parser.add_argument( + "-psat", "--psat_antoine", type=lambda x: str(x).lower() in ["true", "1"], default=True, - help="Use Antoine coefficients for vapor pressure in MP model (True or False, default: True).", + metavar="{true,false}", + help="Use Antoine coefficients for vapor pressure in MP model (optional, default: true).", ) # Parse arguments diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6647d03 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,78 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "fuellib" +version = "0.1.0" +description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" +readme = "README.md" +license = {text = "Apache-2.0"} +authors = [ + {name = "NLR", email = "david.montgomery@nlr.gov"}, +] +requires-python = ">=3.8" +keywords = ["fuel", "thermodynamics", "group-contribution", "properties"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering", +] + +dependencies = [ + "numpy>=1.19.0", + "pandas>=1.0.0", + "scipy>=1.5.0", + "importlib-resources>=5.0; python_version < '3.9'", +] + +[project.optional-dependencies] +dev = [ + "black>=26.3.1", + "pytest>=6.0", + "sphinx>=4.0", + "sphinx-rtd-theme>=1.0", + "sphinxcontrib-bibtex>=2.0", +] + +[project.scripts] +fl-export-converge = "fuellib.exporters.converge:main" +fl-export-pele = "fuellib.exporters.pele:main" + +[project.urls] +Repository = "https://github.com/NatLabRockies/FuelLib" +Issues = "https://github.com/NatLabRockies/FuelLib/issues" +Documentation = "https://NatLabRockies.github.io/FuelLib" + +[tool.setuptools] +packages = ["fuellib", "fuellib.exporters"] + +[tool.setuptools.package-data] +fuellib = [ + "data/**/*.csv", +] + +[tool.black] +line-length = 88 +target-version = ["py38", "py39", "py310", "py311", "py312"] +extend-exclude = ''' +/( + # directories + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | build + | dist +)/ +''' diff --git a/tests/get_pred_and_data.py b/tests/get_pred_and_data.py index 5c5a840..1ec0b6b 100644 --- a/tests/get_pred_and_data.py +++ b/tests/get_pred_and_data.py @@ -1,14 +1,11 @@ import os -import sys import numpy as np import pandas as pd -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * -import FuelLib as fl +import fuellib as fl +from fuellib._data_locator import get_fueldata_props_dir + +FUELDATA_PROPS_DIR = get_fueldata_props_dir() def get_pred_and_data(fuel_name, prop_name): diff --git a/tests/test_accuracy.py b/tests/test_accuracy.py index 8373ca2..69570ff 100644 --- a/tests/test_accuracy.py +++ b/tests/test_accuracy.py @@ -1,15 +1,12 @@ import os -import sys import numpy as np import pandas as pd from get_pred_and_data import get_pred_and_data import unittest -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * +# Locate the tests baseline directory +TESTS_DIR = os.path.dirname(os.path.abspath(__file__)) +TESTS_BASELINE_DIR = os.path.join(TESTS_DIR, "baselinePredictions") class CompTestCase(unittest.TestCase): diff --git a/tests/test_api.py b/tests/test_api.py index ad74dbd..55e9364 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,15 +1,8 @@ import inspect -import os -import sys import unittest import numpy as np -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * -import FuelLib as fl +import fuellib as fl def _normalize_signature(sig): diff --git a/tutorials/basic.py b/tutorials/basic.py index 9fd432a..7a30bca 100644 --- a/tutorials/basic.py +++ b/tutorials/basic.py @@ -1,11 +1,4 @@ -import os -import sys - -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -sys.path.append(FUELLIB_DIR) -import paths -import FuelLib as fl +import fuellib as fl # Create a fuel object for the fuel "heptane-decane" fuel = fl.fuel("heptane-decane") diff --git a/tutorials/compositionPlots.py b/tutorials/compositionPlots.py index 2a05525..1d2d831 100644 --- a/tutorials/compositionPlots.py +++ b/tutorials/compositionPlots.py @@ -1,15 +1,9 @@ -import os -import sys import numpy as np import pandas as pd import re import matplotlib.pyplot as plt -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -sys.path.append(FUELLIB_DIR) -import paths -import FuelLib as fl +import fuellib as fl fuel_name = "posf10325" diff --git a/tutorials/hefaBlends.py b/tutorials/hefaBlends.py index 333d179..1b89fe8 100644 --- a/tutorials/hefaBlends.py +++ b/tutorials/hefaBlends.py @@ -1,14 +1,9 @@ import os -import sys import numpy as np import pandas as pd import matplotlib.pyplot as plt -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -sys.path.append(FUELLIB_DIR) -from paths import * -import FuelLib as fl +import fuellib as fl # ----------------------------------------------------------------------------- # Calculate mixture properties from the group contribution properties @@ -65,7 +60,7 @@ def getPredAndData(fuel_name, prop_name, blend): jetA = fl.fuel(conv_fuel_name) data_file = "hefa-jet-a-blends.csv" - data = pd.read_csv(os.path.join(FUELDATA_PROPS_DIR, data_file), skiprows=[1]) + data = pd.read_csv(os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1]) col = f"{prop_name}_{fuel_name[5:].upper()}" prop_data = data[col] blend_data = data["HEFA_concentration"] diff --git a/tutorials/mixtureProperties.py b/tutorials/mixtureProperties.py index 75b86da..6117341 100644 --- a/tutorials/mixtureProperties.py +++ b/tutorials/mixtureProperties.py @@ -1,14 +1,9 @@ import os -import sys import numpy as np import pandas as pd import matplotlib.pyplot as plt -# Add the FuelLib directory to the Python path -FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) -sys.path.append(FUELLIB_DIR) -from paths import * -import FuelLib as fl +import fuellib as fl # ----------------------------------------------------------------------------- # Calculate mixture properties from the group contribution properties @@ -89,7 +84,7 @@ def getPredAndData(fuel_name, prop_name): data_file = f"{fuel_name}.csv" try: - data = pd.read_csv(os.path.join(FUELDATA_PROPS_DIR, data_file), skiprows=[1]) + data = pd.read_csv(os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1]) # Separate properties and associated temperatures from data T_data = data.Temperature[data[prop_name].notna()] prop_data = data[prop_name].dropna() From 5ff75aab118e0f80f85293db827e56bd4a5a9a69 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 11:23:32 -0600 Subject: [PATCH 02/48] Better docs building --- README.md | 39 ++++++------ docs/conf.py | 3 +- docs/fuelprops.rst | 32 +++++----- docs/sourcecode.rst | 2 +- docs/tutorials-basic.rst | 22 ++++--- ...erge.rst => tutorials-export-converge.rst} | 2 +- ...ort4pele.rst => tutorials-export-pele.rst} | 22 ++++--- docs/tutorials.rst | 4 +- fuellib/build_docs.py | 60 +++++++++++++++++++ fuellib/clean_docs.py | 50 ++++++++++++++++ fuellib/exporters/converge.py | 2 +- fuellib/exporters/pele.py | 8 +-- fuellib/format_code.py | 38 ++++++++++++ pyproject.toml | 4 ++ 14 files changed, 220 insertions(+), 68 deletions(-) rename docs/{tutorials-export4converge.rst => tutorials-export-converge.rst} (96%) rename docs/{tutorials-export4pele.rst => tutorials-export-pele.rst} (92%) create mode 100644 fuellib/build_docs.py create mode 100644 fuellib/clean_docs.py create mode 100644 fuellib/format_code.py diff --git a/README.md b/README.md index dd91be7..92dd29d 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,6 @@ If you use FuelLib in your research, please cite the following software record: Montgomery, David, Appukuttan, Sreejith, Yellapantula, Shashank, Perry, Bruce, and Binswanger, Adam. FuelLib (Fuel Library) [SWR-25-26]. Computer Software. https://github.com/NatLabRockies/FuelLib. USDOE Office of Energy Efficiency and Renewable Energy (EERE), Office of Sustainable Transportation. Vehicle Technologies Office (VTO). 27 Feb. 2025. Web. doi:10.11578/dc.20250317.1. ~~~ -## Python Environment -The following conda environment is required to run this code: -~~~ -conda create --name fuellib-env matplotlib pandas scipy black=26.3.1 -~~~ - ## Installation 1. **Clone the repository:** @@ -31,16 +25,23 @@ conda create --name fuellib-env matplotlib pandas scipy black=26.3.1 2. **Create and activate the conda environment:** ~~~ - conda create --name fuellib-env matplotlib pandas scipy black=26.3.1 + conda create --name fuellib-env python numpy pandas scipy matplotlib conda activate fuellib-env ~~~ -3. **Install FuelLib in development mode:** +3. **Install FuelLib:** + + **Option A: Basic installation**: ~~~ pip install -e . ~~~ -This will install FuelLib and make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available in your environment. + **Option B: Full development installation** (includes documentation, testing, and formatting tools): + ~~~ + pip install -e ".[dev]" + ~~~ + +This will install FuelLib and make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available in your environment. If you installed with `[dev]`, you can also use `fl-build-docs` and `fl-clean-docs` to manage documentation, and `fl-format` to format code. ## Running the Code This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). @@ -64,23 +65,25 @@ New contributions are always welcome. If you have an idea for a new feature fol 1. Fork the main repository 2. Create a `newFeature` branch that contains your changes 3. Update the sphinx documentation in `newFeature` -4. Format the source code files using the [Black code formatter](https://github.com/psf/black) by running the following command: - (CI currently uses Black version `26.3.1`; use the same version locally.) +4. Format the source code files using the provided CLI command: ~~~ - find . -name "*.py" -print0 | xargs -0 black + fl-format ~~~ + (Requires installing with `pip install -e ".[dev]"`. Uses Black version `26.3.1`.) 5. Open a Pull Request (PR) from `newFeature` on your fork to branch `main` FuelLib repository. ## Sphinx Documentation -This repository uses [Sphinx](https://www.sphinx-doc.org/en/master/usage/quickstart.html) to generate documentation. This requires the following Conda environment: +This repository uses [Sphinx](https://www.sphinx-doc.org/en/master/usage/quickstart.html) to generate documentation. + +To build the documentation, first install FuelLib with development support: ~~~ -conda create --name sphinx-env sphinx sphinx_rtd_theme sphinxcontrib-bibtex pandas scipy +pip install -e ".[dev]" ~~~ -To view the documentation locally, build the html using the following: +Then use the provided CLI command: ~~~ -cd FuelLib/docs/ -sphinx-build -M html . _build/ +fl-build-docs ~~~ -You should now be able to view the html by opening `FuelLib/docs/_build/html/index.html` in a web browser. + +The HTML documentation will be generated in `docs/_build/html/`. Open `docs/_build/html/index.html` in your web browser to view it. diff --git a/docs/conf.py b/docs/conf.py index f7c8888..f8d8fc1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,7 +5,8 @@ import os import sys -sys.path.insert(0, os.path.abspath("../source")) +# Add parent directory to path so we can import fuellib +sys.path.insert(0, os.path.abspath("..")) # -- Project information ----------------------------------------------------- diff --git a/docs/fuelprops.rst b/docs/fuelprops.rst index 784395a..a099184 100644 --- a/docs/fuelprops.rst +++ b/docs/fuelprops.rst @@ -138,7 +138,7 @@ provided :math:`T` in K unless noted otherwise. Kinematic viscosity ^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.viscosity_kinematic +.. automethod:: fuellib.fuel.viscosity_kinematic :noindex: The kinematic viscosity of the *i-th* compound of the fuel, @@ -159,7 +159,7 @@ Liquids\ :footcite:p:`viswanath_viscosity_2007`) provided :math:`T` in :math:`^{ Latent heat of vaporization ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.latent_heat_vaporization +.. automethod:: fuellib.fuel.latent_heat_vaporization :noindex: The latent heat of vaporization for each compound at standard pressure and @@ -178,7 +178,7 @@ temperature\ :footcite:p:`govindaraju_group_2016`: Liquid molar volume ^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.molar_liquid_vol +.. automethod:: fuellib.fuel.molar_liquid_vol :noindex: The liquid molar volume is calculated at a specific temperature :math:`T` using @@ -203,7 +203,7 @@ where Density ^^^^^^^ -.. automethod:: FuelLib.fuel.density +.. automethod:: fuellib.fuel.density :noindex: The density of the *i-th* compound is given by @@ -215,7 +215,7 @@ The density of the *i-th* compound is given by Liquid specific heat capacity ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.Cl +.. automethod:: fuellib.fuel.Cl :noindex: The liquid specific heat capacity for each compound at standard pressure temperature is calculated from the specific heat capacity as: @@ -228,7 +228,7 @@ The liquid specific heat capacity for each compound at standard pressure tempera Saturated vapor pressure ^^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.psat +.. automethod:: fuellib.fuel.psat :noindex: The saturated vapor pressure for each compound is calculated as a function of @@ -260,7 +260,7 @@ The Ambrose-Walton\ :footcite:p:`ambrose_vapour_1989` correlation sets: with :math:`\tau_i = 1 - T_{r,i}`. -.. automethod:: FuelLib.fuel.psat_antoine_coeffs +.. automethod:: fuellib.fuel.psat_antoine_coeffs :noindex: Users also have the option to return the coefficients from an Antoine fit based on @@ -279,7 +279,7 @@ for additional information. Surface tension ^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.surface_tension +.. automethod:: fuellib.fuel.surface_tension :noindex: Surface tension for each compound is approximated using the relation: @@ -302,7 +302,7 @@ or by Curl and Pitzer\ :footcite:p:`poling_properties_2001` \ :footcite:p:`curl_ Thermal conductivity ^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.thermal_conductivity +.. automethod:: fuellib.fuel.thermal_conductivity :noindex: Thermal conductivity for each compound is computed according to the method of @@ -389,7 +389,7 @@ are used throughout this section. Conventional mixing rules ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autofunction:: FuelLib.mixing_rule +.. autofunction:: fuellib.mixing_rule :noindex: While many of the mixture properties in FuelLib have a unique mixing rule, @@ -415,7 +415,7 @@ where :math:`Q_i` is the property of the *i-th* compound of the multicomponent m Mixture density ^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.mixture_density +.. automethod:: fuellib.fuel.mixture_density :noindex: The mixture's density is calculated as: @@ -428,7 +428,7 @@ The mixture's density is calculated as: Mixture kinematic viscosity ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.mixture_kinematic_viscosity +.. automethod:: fuellib.fuel.mixture_kinematic_viscosity :noindex: The kinematic viscosity of the mixture is computed using the Kendall-Monroe\ :footcite:p:`kendall_viscosity_1917` @@ -453,7 +453,7 @@ The Arrhenius rule is: Mixture vapor pressure ^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.mixture_vapor_pressure +.. automethod:: fuellib.fuel.mixture_vapor_pressure :noindex: The vapor pressure of the mixture is calculated according to Raoult's law: @@ -462,7 +462,7 @@ The vapor pressure of the mixture is calculated according to Raoult's law: p_{v} = \sum_{i = 1}^{N_c} X_i \, p_{\textit{sat},i}. -.. automethod:: FuelLib.fuel.mixture_vapor_pressure_antoine_coeffs +.. automethod:: fuellib.fuel.mixture_vapor_pressure_antoine_coeffs :noindex: Users also have the option to return the coefficients from an Antoine fit based on @@ -481,7 +481,7 @@ for additional information. Mixture surface tension ^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.mixture_surface_tension +.. automethod:: fuellib.fuel.mixture_surface_tension :noindex: The surface tension of the mixture is calculated using the :ref:`conventional-mixing-rules` @@ -494,7 +494,7 @@ Hugill and van Welsenes\ :footcite:p:`hugill_surface_1986`: Mixture thermal conductivity ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. automethod:: FuelLib.fuel.mixture_thermal_conductivity +.. automethod:: fuellib.fuel.mixture_thermal_conductivity :noindex: The thermal conductivity of the mixture is calculated using the power law method of diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index 53ebce1..bf92b45 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -55,4 +55,4 @@ Click on links below for the full auto-documentation of the API. .. autosummary:: :toctree: generated - FuelLib \ No newline at end of file + fuellib \ No newline at end of file diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index dfb2bcb..97f167b 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -11,15 +11,20 @@ Download and Setup Clone the FuelLib repository from GitHub: :: git clone https://github.com/NatLabRockies/FuelLib.git + cd FuelLib -Create and activate a Conda environment, install the required dependencies: :: +Create and activate a Conda environment with the required dependencies: :: - conda create --name fuellib-env matplotlib pandas scipy + conda create --name fuellib-env python numpy pandas scipy matplotlib conda activate fuellib-env -Change to the FuelLib/tutorials directory: :: +Install FuelLib: :: - cd FuelLib/tutorials + pip install -e . + +Change to the tutorials directory: :: + + cd tutorials Required Input Files and Decomposing Fuel Components ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -75,14 +80,7 @@ as ``basic.py``. To begin, we will import the necessary modules and create a ``f .. code-block:: python - import os - import sys - - # Add the FuelLib directory to the Python path - FUELLIB_DIR = os.path.dirname(os.path.dirname(__file__)) - sys.path.append(FUELLIB_DIR) - import paths - import FuelLib as fl + import fuellib as fl # Create a fuel object for the fuel "heptane-decane" fuel = fl.fuel("heptane-decane") diff --git a/docs/tutorials-export4converge.rst b/docs/tutorials-export-converge.rst similarity index 96% rename from docs/tutorials-export4converge.rst rename to docs/tutorials-export-converge.rst index 3b97c72..997f1bf 100644 --- a/docs/tutorials-export4converge.rst +++ b/docs/tutorials-export-converge.rst @@ -50,7 +50,7 @@ Additional Options There are several additional options that can be specified when running the ``fl-export-converge`` command: -- ``-D, --fuel_data_dir PATH``: Directory containing the fuel data files. Default: ``FuelLib/fuelData``. +- ``-dir, --fuel_data_dir PATH``: Directory containing the fuel data files. Default: ``FuelLib/fuelData``. - ``-u, --units {mks,cgs}``: Units for the properties. Default: ``mks``. - ``-t, --temp_min K``: Minimum temperature for property calculations. Default: ``0``. - ``-T, --temp_max K``: Maximum temperature for property calculations. Default: ``1000``. diff --git a/docs/tutorials-export4pele.rst b/docs/tutorials-export-pele.rst similarity index 92% rename from docs/tutorials-export4pele.rst rename to docs/tutorials-export-pele.rst index 31d0105..e619a77 100644 --- a/docs/tutorials-export4pele.rst +++ b/docs/tutorials-export-pele.rst @@ -41,7 +41,7 @@ for each compound in the fuel: - Optionally, Antoine coefficients for vapor pressure -The export script, ``Export4Pele.py``, generates an input file containing +The ``fl-export-pele`` command generates an input file containing the necessary properties for each compound in the fuel. The following sections walk through the process and the available options for exporting properties from FuelLib to Pele. @@ -120,14 +120,14 @@ Additional Options There are many additional options that can be specified when running the ``fl-export-pele`` command: -- ``-c, --fuel_decomp_name NAME``: Name of the decomposition file (optional). If not provided, defaults to fuel name. -- ``-D, --fuel_data_dir PATH``: Directory containing the fuel data files. Default: ``FuelLib/fuelData``. +- ``-decomp, --fuel_decomp_name NAME``: Name of the decomposition file (optional). If not provided, defaults to fuel name. +- ``-dir, --fuel_data_dir PATH``: Directory containing the fuel data files. Default: ``FuelLib/fuelData``. - ``-u, --units {mks,cgs}``: Units for the properties. Default: ``mks`` (use ``cgs`` for PeleC). -- ``-d, --dep_fuel_names NAME [NAME ...]``: Gas-phase species that liquid fuel deposits to. Default: fuel compound names. +- ``-dep, --dep_fuel_names NAME [NAME ...]``: Gas-phase species that liquid fuel deposits to. Default: fuel compound names. - ``-pp, --use_pp_keys {true,false}``: Use PelePhysics keys for each compound. Default: ``true``. - ``-o, --export_dir PATH``: Directory to export the file. Default: ``./exportData``. - ``-m, --export_mix {true,false}``: Export fuel as a single mixture species. Default: ``false``. -- ``-n, --export_mix_name NAME``: Name of the mixture species if ``-m`` is set to true. Default: fuel name. +- ``-mn, --export_mix_name NAME``: Name of the mixture species if ``-m`` is set to true. Default: fuel name. - ``-l, --liq_prop_model {gcm,mp}``: Liquid property model to use. Default: ``gcm``. - ``-psat, --psat_antoine {true,false}``: Use Antoine coefficients for vapor pressure in MP model. Default: ``true``. @@ -136,7 +136,7 @@ Liquid Species Deposit to Single Gas-Phase Species To specify all liquid fuel species deposit to a single gas-phase species, run: :: - fl-export-pele -f heptane-decane -d SINGLE_GAS + fl-export-pele -f heptane-decane -dep SINGLE_GAS Or with long options: :: @@ -206,10 +206,9 @@ where the liquid fuel is modeled as a single component that deposits to the HyCh Exporting Properties for the MP Model in Pele ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Users can export properties for the MP model in Pele by specifying ``--liq_prop_model mp`` when running the export script: :: +Users can export properties for the MP model in Pele by specifying ``--liq_prop_model mp`` when running the export command: :: - cd FuelLib/source - python Export4Pele.py --fuel_name heptane-decane --liq_prop_model mp + fl-export-pele --fuel_name heptane-decane --liq_prop_model mp This generates the following input file, ``FuelLib/exportData/sprayPropsMP_heptane-decane.inp``, for use in a PeleLMeX simulation: :: @@ -243,10 +242,9 @@ This generates the following input file, ``FuelLib/exportData/sprayPropsMP_hepta particles.NC10H22_rho = 726.195341 # kg/m^3 particles.NC10H22_psat = 4.380101435197679 1702.1569216938776 -60.0774808903445 100000.0 # Pa -Users can choose to not use Antoine coefficients for vapor pressure in the MP model by specifying ``--psat_antoine False`` when running the export script: :: +Users can choose to not use Antoine coefficients for vapor pressure in the MP model by specifying ``--psat_antoine False`` when running the export command: :: - cd FuelLib/source - python Export4Pele.py --fuel_name heptane-decane --liq_prop_model mp --psat_antoine False + fl-export-pele --fuel_name heptane-decane --liq_prop_model mp --psat_antoine False This generates a similar input file as above, but without the Antoine coefficients for vapor pressure. diff --git a/docs/tutorials.rst b/docs/tutorials.rst index ea64f53..99c47f3 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -7,8 +7,8 @@ This section provides tutorials on how to use the FuelLib library. :maxdepth: 4 tutorials-basic - tutorials-export4pele - tutorials-export4converge + tutorials-export-pele + tutorials-export-converge diff --git a/fuellib/build_docs.py b/fuellib/build_docs.py new file mode 100644 index 0000000..d47cae7 --- /dev/null +++ b/fuellib/build_docs.py @@ -0,0 +1,60 @@ +""" +Build Sphinx documentation for FuelLib. + +This script builds the HTML documentation using Sphinx, handling the proper +setup of paths and environment variables needed for autodoc to work correctly. +""" + +import os +import sys +import subprocess + + +def main(): + """ + Build the FuelLib documentation. + + Changes to the docs directory and runs sphinx-build to generate HTML documentation. + """ + # Get the directory of this script (fuellib package) + fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the project root (one level up from fuellib package) + project_root = os.path.dirname(fuellib_dir) + + # Docs directory + docs_dir = os.path.join(project_root, "docs") + + # Ensure fuellib is in the Python path for autodoc + if fuellib_dir not in sys.path: + sys.path.insert(0, os.path.dirname(fuellib_dir)) + + # Build command + build_cmd = [ + "sphinx-build", + "-M", "html", + docs_dir, + os.path.join(docs_dir, "_build"), + ] + + print(f"Building documentation from {docs_dir}") + print(f"Command: {' '.join(build_cmd)}") + print() + + # Run sphinx-build + result = subprocess.run(build_cmd) + + if result.returncode == 0: + print() + print("=" * 80) + print("Documentation built successfully!") + print(f"View the documentation at: {os.path.join(docs_dir, '_build', 'html', 'index.html')}") + print("=" * 80) + else: + print() + print("Documentation build failed. Please check the errors above.") + sys.exit(result.returncode) + + +if __name__ == "__main__": + main() diff --git a/fuellib/clean_docs.py b/fuellib/clean_docs.py new file mode 100644 index 0000000..96d2556 --- /dev/null +++ b/fuellib/clean_docs.py @@ -0,0 +1,50 @@ +"""Remove Sphinx documentation build artifacts.""" + +import os +import shutil +import sys + + +def main(): + """ + Remove the documentation build directory and generated files. + + Cleans up the Sphinx build output in docs/_build/ and + generated documentation in docs/generated/ + """ + # Get the directory of this script (fuellib package) + fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the project root (one level up from fuellib package) + project_root = os.path.dirname(fuellib_dir) + + # Docs directory + docs_dir = os.path.join(project_root, "docs") + build_dir = os.path.join(docs_dir, "_build") + generated_dir = os.path.join(docs_dir, "generated") + + # Remove build directory + if os.path.exists(build_dir): + try: + shutil.rmtree(build_dir) + print(f"Removed documentation build directory: {build_dir}") + except Exception as e: + print(f"Error removing build directory: {e}", file=sys.stderr) + sys.exit(1) + else: + print(f"Build directory does not exist: {build_dir}") + + # Remove generated directory + if os.path.exists(generated_dir): + try: + shutil.rmtree(generated_dir) + print(f"Removed generated documentation directory: {generated_dir}") + except Exception as e: + print(f"Error removing generated directory: {e}", file=sys.stderr) + sys.exit(1) + else: + print(f"Generated directory does not exist: {generated_dir}") + + +if __name__ == "__main__": + main() diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index bc24a70..4df94cb 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -553,7 +553,7 @@ def main(): # Optional argument for fuel data directory parser.add_argument( - "-D", + "-dir", "--fuel_data_dir", default=FUELDATA_DIR, metavar="PATH", diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index c209665..fdea89e 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -568,7 +568,7 @@ def main(): # Optional argument for fuel data directory parser.add_argument( - "-D", + "-dir", "--fuel_data_dir", default=FUELDATA_DIR, metavar="PATH", @@ -577,7 +577,7 @@ def main(): # Optional argument for decomposition file name parser.add_argument( - "-c", + "-decomp", "--fuel_decomp_name", default=None, metavar="NAME", @@ -596,7 +596,7 @@ def main(): # Optional argument for deposition fuel names parser.add_argument( - "-d", + "-dep", "--dep_fuel_names", nargs="+", # Accepts one or more values default=None, @@ -635,7 +635,7 @@ def main(): # Optional argument for mixture name if different than fuel_name parser.add_argument( - "-n", + "-mn", "--export_mix_name", default=None, metavar="NAME", diff --git a/fuellib/format_code.py b/fuellib/format_code.py new file mode 100644 index 0000000..5ce91c0 --- /dev/null +++ b/fuellib/format_code.py @@ -0,0 +1,38 @@ +"""Format all Python source code using Black.""" + +import subprocess +import sys + + +def main(): + """Run Black formatter on all Python files in the repository.""" + try: + result = subprocess.run( + ['find', '.', '-name', '*.py', '-print0'], + capture_output=True, + text=False, + check=True, + ) + + # Use xargs to pass files to black + process = subprocess.Popen( + ['xargs', '-0', 'black'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = process.communicate(input=result.stdout) + + if stdout: + print(stdout.decode()) + if stderr: + print(stderr.decode(), file=sys.stderr) + + sys.exit(process.returncode) + except Exception as e: + print(f"Error running black formatter: {e}", file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index 6647d03..98018ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ dev = [ "black>=26.3.1", "pytest>=6.0", + "matplotlib>=3.0", "sphinx>=4.0", "sphinx-rtd-theme>=1.0", "sphinxcontrib-bibtex>=2.0", @@ -46,6 +47,9 @@ dev = [ [project.scripts] fl-export-converge = "fuellib.exporters.converge:main" fl-export-pele = "fuellib.exporters.pele:main" +fl-build-docs = "fuellib.build_docs:main" +fl-clean-docs = "fuellib.clean_docs:main" +fl-format = "fuellib.format_code:main" [project.urls] Repository = "https://github.com/NatLabRockies/FuelLib" From 285efe5501b67372d4c5e1fcc2ba5dedaacb3f5d Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 11:26:01 -0600 Subject: [PATCH 03/48] Better formatting via fl-format --- fuellib/__init__.py | 3 ++- fuellib/build_docs.py | 23 +++++++++++++---------- fuellib/clean_docs.py | 12 ++++++------ fuellib/format_code.py | 17 ++++++++++++----- tutorials/hefaBlends.py | 4 +++- tutorials/mixtureProperties.py | 4 +++- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 2367631..150826f 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -1,7 +1,7 @@ """ FuelLib: Fuel Library for Group Contribution Method calculations. -FuelLib utilizes the Group Contribution Method (GCM) as proposed by Constantinou +FuelLib utilizes the Group Contribution Method (GCM) as proposed by Constantinou and Gani (1994, 1995) to calculate thermodynamic and mixture properties of fuels. """ @@ -1032,6 +1032,7 @@ def mixture_thermal_conductivity(self, Yi, T): # Utility functions # ------- + def C2K(T): """ Convert temperature from Celsius to Kelvin. diff --git a/fuellib/build_docs.py b/fuellib/build_docs.py index d47cae7..7d0eff9 100644 --- a/fuellib/build_docs.py +++ b/fuellib/build_docs.py @@ -13,42 +13,45 @@ def main(): """ Build the FuelLib documentation. - + Changes to the docs directory and runs sphinx-build to generate HTML documentation. """ # Get the directory of this script (fuellib package) fuellib_dir = os.path.dirname(os.path.abspath(__file__)) - + # Get the project root (one level up from fuellib package) project_root = os.path.dirname(fuellib_dir) - + # Docs directory docs_dir = os.path.join(project_root, "docs") - + # Ensure fuellib is in the Python path for autodoc if fuellib_dir not in sys.path: sys.path.insert(0, os.path.dirname(fuellib_dir)) - + # Build command build_cmd = [ "sphinx-build", - "-M", "html", + "-M", + "html", docs_dir, os.path.join(docs_dir, "_build"), ] - + print(f"Building documentation from {docs_dir}") print(f"Command: {' '.join(build_cmd)}") print() - + # Run sphinx-build result = subprocess.run(build_cmd) - + if result.returncode == 0: print() print("=" * 80) print("Documentation built successfully!") - print(f"View the documentation at: {os.path.join(docs_dir, '_build', 'html', 'index.html')}") + print( + f"View the documentation at: {os.path.join(docs_dir, '_build', 'html', 'index.html')}" + ) print("=" * 80) else: print() diff --git a/fuellib/clean_docs.py b/fuellib/clean_docs.py index 96d2556..ca0b453 100644 --- a/fuellib/clean_docs.py +++ b/fuellib/clean_docs.py @@ -8,21 +8,21 @@ def main(): """ Remove the documentation build directory and generated files. - - Cleans up the Sphinx build output in docs/_build/ and + + Cleans up the Sphinx build output in docs/_build/ and generated documentation in docs/generated/ """ # Get the directory of this script (fuellib package) fuellib_dir = os.path.dirname(os.path.abspath(__file__)) - + # Get the project root (one level up from fuellib package) project_root = os.path.dirname(fuellib_dir) - + # Docs directory docs_dir = os.path.join(project_root, "docs") build_dir = os.path.join(docs_dir, "_build") generated_dir = os.path.join(docs_dir, "generated") - + # Remove build directory if os.path.exists(build_dir): try: @@ -33,7 +33,7 @@ def main(): sys.exit(1) else: print(f"Build directory does not exist: {build_dir}") - + # Remove generated directory if os.path.exists(generated_dir): try: diff --git a/fuellib/format_code.py b/fuellib/format_code.py index 5ce91c0..7d846f1 100644 --- a/fuellib/format_code.py +++ b/fuellib/format_code.py @@ -1,33 +1,40 @@ """Format all Python source code using Black.""" +import os import subprocess import sys def main(): """Run Black formatter on all Python files in the repository.""" + # Get the directory of this script (fuellib package) + fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the project root (one level up from fuellib package) + project_root = os.path.dirname(fuellib_dir) + try: result = subprocess.run( - ['find', '.', '-name', '*.py', '-print0'], + ["find", project_root, "-name", "*.py", "-print0"], capture_output=True, text=False, check=True, ) - + # Use xargs to pass files to black process = subprocess.Popen( - ['xargs', '-0', 'black'], + ["xargs", "-0", "black"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) stdout, stderr = process.communicate(input=result.stdout) - + if stdout: print(stdout.decode()) if stderr: print(stderr.decode(), file=sys.stderr) - + sys.exit(process.returncode) except Exception as e: print(f"Error running black formatter: {e}", file=sys.stderr) diff --git a/tutorials/hefaBlends.py b/tutorials/hefaBlends.py index 1b89fe8..97a06af 100644 --- a/tutorials/hefaBlends.py +++ b/tutorials/hefaBlends.py @@ -60,7 +60,9 @@ def getPredAndData(fuel_name, prop_name, blend): jetA = fl.fuel(conv_fuel_name) data_file = "hefa-jet-a-blends.csv" - data = pd.read_csv(os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1]) + data = pd.read_csv( + os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1] + ) col = f"{prop_name}_{fuel_name[5:].upper()}" prop_data = data[col] blend_data = data["HEFA_concentration"] diff --git a/tutorials/mixtureProperties.py b/tutorials/mixtureProperties.py index 6117341..72fc367 100644 --- a/tutorials/mixtureProperties.py +++ b/tutorials/mixtureProperties.py @@ -84,7 +84,9 @@ def getPredAndData(fuel_name, prop_name): data_file = f"{fuel_name}.csv" try: - data = pd.read_csv(os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1]) + data = pd.read_csv( + os.path.join(fl.get_fueldata_props_dir(), data_file), skiprows=[1] + ) # Separate properties and associated temperatures from data T_data = data.Temperature[data[prop_name].notna()] prop_data = data[prop_name].dropna() From 16ed541bc7489cace5ca0256b32d9638f7cca686 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 11:30:16 -0600 Subject: [PATCH 04/48] Update CI --- .github/workflows/ci.yml | 35 +++++++++++++++-------------- .github/workflows/documentation.yml | 6 ++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca9afd5..28e6c03 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: python-version: '3.11' - run: | python -m pip install --upgrade pip - pip install numpy pandas scipy + pip install -e . - run: python tests/test_accuracy.py API: @@ -62,7 +62,7 @@ jobs: python-version: '3.11' - run: | python -m pip install --upgrade pip - pip install numpy pandas scipy + pip install -e . - run: python tests/test_api.py -v Source-Docstrings: @@ -74,6 +74,7 @@ jobs: python-version: '3.11' - run: | python -m pip install --upgrade pip + pip install -e . - run: python tests/test_source_docstrings.py -v Exporting-Scripts: @@ -85,19 +86,19 @@ jobs: python-version: '3.11' - run: | python -m pip install --upgrade pip - pip install numpy pandas scipy - - name: Export4Pele - individual component export - run: python source/Export4Pele.py --fuel_name posf10264 - - name: Export4Pele - mixture export with GCM model - run: python source/Export4Pele.py --fuel_name posf10264 --export_mix True - - name: Export4Pele - mixture export with MP model - run: python source/Export4Pele.py --fuel_name posf10264 --export_mix True --liq_prop_model mp - - name: Export4Pele - mixture export with CGS units - run: python source/Export4Pele.py --fuel_name posf10264 --export_mix True --units cgs - - name: Export4Pele - single deposit species - run: python source/Export4Pele.py --fuel_name posf10264 --dep_fuel_names POSF10264 - - name: Export4Converge - individual component export - run: python source/Export4Converge.py --fuel_name posf10264 - - name: Export4Converge - mixture export - run: python source/Export4Converge.py --fuel_name posf10264 --export_mix 1 --temp_min 280 --temp_max 400 --temp_step 10 + pip install -e . + - name: fl-export-pele - individual component export + run: fl-export-pele -f posf10264 + - name: fl-export-pele - mixture export with GCM model + run: fl-export-pele -f posf10264 -m true + - name: fl-export-pele - mixture export with MP model + run: fl-export-pele -f posf10264 -m true -l mp + - name: fl-export-pele - mixture export with CGS units + run: fl-export-pele -f posf10264 -m true -u cgs + - name: fl-export-pele - single deposit species + run: fl-export-pele -f posf10264 -dep POSF10264 + - name: fl-export-converge - individual component export + run: fl-export-converge -f posf10264 + - name: fl-export-converge - mixture export + run: fl-export-converge -f posf10264 -m true -t 280 -T 400 -s 10 diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 382605a..ec72fa2 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -32,17 +32,17 @@ jobs: - name: Install dependencies run: | - pip install sphinx sphinx_rtd_theme myst_parser sphinxcontrib-bibtex pandas scipy + pip install -e ".[dev]" - name: Build docs run: | - sphinx-build -b html -W docs _build + fl-build-docs - name: Upload artifact (for PR preview or later steps) uses: actions/upload-artifact@v4 with: name: site - path: _build + path: docs/_build/html Deploy-Docs: if: github.event_name == 'push' From 1f3b7aaba4f32b6ba20cfb83162ad7e648761239 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 11:42:44 -0600 Subject: [PATCH 05/48] Specify molar vs. mass Cp --- docs/fuelprops.rst | 8 ++++---- docs/tutorials-export-converge.rst | 2 +- docs/tutorials-export-pele.rst | 2 +- fuellib/__init__.py | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/fuelprops.rst b/docs/fuelprops.rst index a099184..f887a7d 100644 --- a/docs/fuelprops.rst +++ b/docs/fuelprops.rst @@ -46,7 +46,7 @@ Table of GCM properties :math:`\Delta H_{v,\textit{stp},i}` J/mol :math:`h_{v1k}`, :math:`h_{v2j}` kJ/mol Enthalpy of vaporization at 298 K\ :footcite:p:`constantinou_new_1994`. :math:`\omega_i` 1 :math:`\omega_{1k}`, :math:`\omega_{2j}` 1 Acentric factor\ :footcite:p:`constantinou_estimation_1995`. :math:`V_{m,\textit{stp},i}` m\ :sup:`3`\ /mol :math:`v_{m1k}`, :math:`v_{m2j}` m\ :sup:`3`\ /kmol Liquid molar volume at 298 K\ :footcite:p:`constantinou_estimation_1995`. - :math:`C_{p,i}` J/mol/K :math:`C_{pA1_k}`, :math:`C_{pA2_k}`,... J/mol/K Specific heat capacity\ :footcite:p:`nielsen_molecular_1998` \ :footcite:p:`poling_properties_2001`. + :math:`C_{p,i}` J/mol/K :math:`C_{pA1_k}`, :math:`C_{pA2_k}`,... J/mol/K Molar specific heat capacity\ :footcite:p:`nielsen_molecular_1998` \ :footcite:p:`poling_properties_2001`. ==================================== ===================== =========================================== ==================== =========================================================== .. _eq-GCM-properties: @@ -113,7 +113,7 @@ provided :math:`T` in K unless noted otherwise. :math:`L_{v,i}` J/kg Temperature-adjusted latent heat of vaporization at 298 K\ :footcite:p:`govindaraju_group_2016`. :math:`V_{m,i}` m\ :sup:`3`\ /mol Temperature-adjusted liquid molar volume\ :footcite:p:`rackett_equation_1970` \ :footcite:p:`yamada_saturated_1973` \ :footcite:p:`govindaraju_group_2016`. :math:`\rho_i` kg/m\ :sup:`3` Density - :math:`C_{\ell,i}` J/kg/K Liquid specific heat capacity\ :footcite:p:`govindaraju_group_2016`. + :math:`C_{\ell,i}` J/kg/K Mass specific heat capacity. :math:`p_{sat,i}` Pa Saturated vapor pressure\ :footcite:p:`lee_generalized_1975` \ :footcite:p:`ambrose_vapour_1989`. :math:`\sigma_i` N/m Surface tension\ :footcite:p:`brock_surface_1955`. :math:`\lambda_i` W/m/K Thermal conductivity\ :footcite:p:`poling_properties_2001`. @@ -212,13 +212,13 @@ The density of the *i-th* compound is given by \rho_i = \frac{M_{w,i}}{V_{m,i}}. -Liquid specific heat capacity +Mass specific heat capacity of the liquid ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: fuellib.fuel.Cl :noindex: -The liquid specific heat capacity for each compound at standard pressure temperature is calculated from the specific heat capacity as: +The mass specific heat capacity for each compound at standard pressure temperature is calculated from the molar specific heat capacity as: .. math:: C_{\ell,i} = \dfrac{C_{p,i}}{M_{w,i}} diff --git a/docs/tutorials-export-converge.rst b/docs/tutorials-export-converge.rst index 997f1bf..4ecd11a 100644 --- a/docs/tutorials-export-converge.rst +++ b/docs/tutorials-export-converge.rst @@ -18,7 +18,7 @@ The properties include: - Latent heat of vaporization - Vapor pressure - Density -- Specific heat +- Mass specific heat - Thermal conductivity .. note:: diff --git a/docs/tutorials-export-pele.rst b/docs/tutorials-export-pele.rst index e619a77..fec9b31 100644 --- a/docs/tutorials-export-pele.rst +++ b/docs/tutorials-export-pele.rst @@ -27,7 +27,7 @@ the following for each compound in the fuel for the GCM: - Boiling point - Accentric factor - Molar volume -- Specific heat coefficients +- Mass specific heat coefficients - Latent heat of vaporization The MP model in PelePhysics requires properties at a specified reference temperature diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 150826f..deab0ff 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -220,7 +220,7 @@ def get_row(property_name): self.Vm_stp = 0.01211 + np.matmul(self.Nij, Vmk) # m^3/kmol self.Vm_stp *= 1e-3 # Convert to m^3/mol - # C_p,stp (specific heat at 298 K) + # C_p,stp (molar specific heat at 298 K) self.Cp_stp = np.matmul(self.Nij, cpak) - 19.7779 # J/mol/K # Temperature corrections for C_p @@ -407,13 +407,13 @@ def viscosity_dynamic(self, T, comp_idx=None): def Cp(self, T, comp_idx=None): """ - Compute specific heat capacity at a given temperature. + Compute molar specific heat capacity at a given temperature. :param T: Temperature in Kelvin. :type T: float :param comp_idx: Index of compound to calculate property for. :type comp_idx: int, optional - :return: Specific heat capacity in J/mol/K. + :return: Molar specific heat capacity in J/mol/K. :rtype: np.ndarray """ @@ -433,13 +433,13 @@ def Cp(self, T, comp_idx=None): def Cl(self, T, comp_idx=None): """ - Compute liquid specific heat capacity in J/kg/K at a given temperature. + Compute liquid mass specific heat capacity in J/kg/K at a given temperature. :param T: Temperature in Kelvin. :type T: float :param comp_idx: Index of compound to calculate property for. :type comp_idx: int, optional - :return: Specific heat capacity in J/kg/K. + :return: Mass specific heat capacity in J/kg/K. :rtype: np.ndarray """ if comp_idx is None: From e0821b62c3e5d1da8d3a65b1ae803d517bc22ffe Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 11:44:24 -0600 Subject: [PATCH 06/48] Extend title in docs --- docs/fuelprops.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fuelprops.rst b/docs/fuelprops.rst index f887a7d..0972039 100644 --- a/docs/fuelprops.rst +++ b/docs/fuelprops.rst @@ -213,7 +213,7 @@ The density of the *i-th* compound is given by Mass specific heat capacity of the liquid -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: fuellib.fuel.Cl :noindex: From a623baf26a5b5aef2c8eb626ddd3256f89b8f2e8 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 12:14:58 -0600 Subject: [PATCH 07/48] Remove old paths.py --- paths.py | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 paths.py diff --git a/paths.py b/paths.py deleted file mode 100644 index a3e68f9..0000000 --- a/paths.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -import sys - -FUELLIB_DIR = os.path.dirname(__file__) -GCMTABLE_DIR = os.path.join(FUELLIB_DIR, "gcmTableData") -SOURCE_DIR = os.path.join(FUELLIB_DIR, "source") -FUELDATA_DIR = os.path.join(FUELLIB_DIR, "fuelData") -FUELDATA_GC_DIR = os.path.join(FUELDATA_DIR, "gcData") -FUELDATA_DECOMP_DIR = os.path.join(FUELDATA_DIR, "groupDecompositionData") -FUELDATA_PROPS_DIR = os.path.join(FUELDATA_DIR, "propertiesData") -TESTS_DIR = os.path.join(FUELLIB_DIR, "tests") -TESTS_BASELINE_DIR = os.path.join(TESTS_DIR, "baselinePredictions") -TUTORIALS_DIR = os.path.join(FUELLIB_DIR, "tutorials") - -sys.path.append(SOURCE_DIR) From 358abbf69c09c5656bf3f111668269fc467dadf6 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 12:26:09 -0600 Subject: [PATCH 08/48] Update MW --- gcmTableData/gcmTable.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcmTableData/gcmTable.csv b/gcmTableData/gcmTable.csv index 997d23d..fd1a89e 100644 --- a/gcmTableData/gcmTable.csv +++ b/gcmTableData/gcmTable.csv @@ -12,4 +12,4 @@ vmk,m^3/kmol,0.0261,0.0164,0.0071,-0.0038,0.0373,0.0269,0.027,0.0161,0.003,0.043 CpAk,J/mol/K,35.1152,22.6346,8.9272,0.3456,49.2506,35.2248,37.6299,21.3528,10.2797,66.0574,16.3794,10.4283,42.8569,32.8206,19.9504,27.2107,39.7712,59.3032,0,40.7501,66.8423,0,51.5048,50.5604,39.5784,25.675,0,57.6861,44.1122,53.7012,44.6388,0,41.4064,30.1561,47.1311,84.7602,0,58.2837,46.5577,48.4648,36.5885,29.1848,60.8262,56.1685,78.6054,33.645,63.7851,51.1442,0,58.2445,29.1815,28.026,45.9768,26.7371,25.8094,30.1696,0,63.2024,44.3567,0,0,0,0,0,22.2082,0,0,0,0,0,0,0,0,57.767,45.0314,40.5275,80.301,0,0.583,0.3226,0.9668,-0.3082,-0.1201,8.5546,3.1721,-5.906,-3.9682,-3.2746,2.6142,-1.3913,0.263,6.5145,4.1707,0,0,3.7978,0,0,0,0,-15.7667,0,0,-6.4072,0,2.4484,-1.5252,0,0,0,0,0,0,0,-2.7407,0,-1.6978,0,-2.2923,-0.3162,0 CpBk,J/mol/K,39.5923,45.0933,59.9786,74.0368,59.384,62.1924,62.1285,66.3947,65.5372,69.3936,32.7433,25.3634,65.6464,70.4153,81.8764,2.7609,35.5676,67.8149,0,19.699,102.4553,0,44.4133,38.9681,41.8177,24.7281,0,64.0768,77.2155,71.7948,68.5041,0,85.0996,81.6814,51.3326,177.2513,0,49.6388,48.2322,37.237,47.6004,52.3817,41.9908,46.9337,32.1318,23.2759,83.4744,94.2934,0,46.9958,-9.7846,-7.1651,20.6417,21.7676,-5.2241,26.9738,0,51.9366,44.5875,0,0,0,0,0,-2.8385,0,0,0,0,0,0,0,0,44.1238,55.1432,55.0141,132.7786,0,-1.2002,2.1309,-2.0762,1.8969,4.2846,-22.9771,-10.0834,-1.871,17.7889,32.167,4.4511,-1.5496,-2.3428,-17.5541,-3.1964,0,0,-7.3251,0,0,0,0,-0.1174,0,0,15.2583,0,-0.0765,-7.638,0,0,0,0,0,0,0,11.1033,0,1.0477,0,3.1142,2.3711,0 CpCk,J/mol/K,-9.9232,-15.7033,-29.5143,-45.7878,-21.7908,-24.8156,-26.0637,-29.3703,-30.6057,-25.1081,-13.1692,-12.7283,-21.067,-28.9361,-40.2864,1.306,-15.5875,-20.9948,0,-5.436,-43.3306,0,-19.6155,-4.7799,-11.0837,4.2419,0,-21.048,-33.5086,-22.9685,-26.7106,0,-35.6318,-36.1441,-25.0276,-72.3213,0,-15.6291,-20.4868,-13.0635,-22.8148,-30.8526,-20.4091,-31.3325,-19.4033,-12.2406,-35.1171,-45.2029,0,-10.5106,3.4554,2.4332,-8.3297,-6.4481,1.4542,-13.3722,0,-28.6308,-23.282,0,0,0,0,0,1.2679,0,0,0,0,0,0,0,0,-9.5565,-18.7776,-31.719,-58.3241,0,-0.0584,-1.5728,0.3148,-1.6454,-2.0262,10.7278,4.9674,4.2945,-3.3639,-17.8246,-5.9808,2.5899,0.8975,10.6977,-1.1997,0,0,2.5312,0,0,0,0,6.1191,0,0,-8.3149,0,0.146,8.1795,0,0,0,0,0,0,0,-11.0878,0,0.2002,0,-1.4995,-1.4825,-0.0584 -MW,g/mol,15,14,13,12,27,26,26,25,24,39,13,12,27,26,25,17,29,43,42,41,59,58,45,31,30,29,49,30,29,30,29,28,29,28,28,78,77,40,45,49.5,48.5,47.5,84,119.5,118.5,47.5,60,59,58,47,35.5,80,25,24,59.5,31,71,69,50,31,44,102,67.5,85.5,0,44,58,57,72,0,70,61,60,47,46,45,83,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file +MW,g/mol,15.0345,14.0266,13.0186,12.0107,27.0452,26.0373,26.0373,25.0293,24.0214,39.0559,25.0293,24.0214,40.0639,39.0559,38.048,17.0073,42.0367,43.0446,42.0367,29.018,59.044,58.0361,45.0174,31.0339,30.026,29.018,49.0244,30.0492,29.0412,30.0492,29.0412,28.0333,29.0412,28.0333,41.0519,78.092,77.084,41.0519,45.0174,49.4796,48.4716,47.4637,83.9246,82.9167,118.3697,60.4823,60.0321,59.0241,70.0269,47.0945,126.9,79.904,25.0293,24.0214,59.4744,44.0277,71.0779,69.0059,50.0075,31.0091,44.0095,101.9151,67.47,85.4605,0,44.0327,58.0593,57.0513,72.0858,0,70.07,61.0599,60.052,47.0945,46.0866,45.0786,83.1266,82.1187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 From 8d527fa3d43b11ef2767ca491aa3b6e55ebd59f8 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 14:02:33 -0600 Subject: [PATCH 09/48] Update installation with pip --- README.md | 50 ++++++++++++++++++++++++---------------- docs/index.rst | 36 +++++++++++++++++++++++++++++ docs/sourcecode.rst | 2 -- docs/tutorials-basic.rst | 12 ++++++++++ 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 92dd29d..fd3ae49 100644 --- a/README.md +++ b/README.md @@ -17,31 +17,41 @@ Montgomery, David, Appukuttan, Sreejith, Yellapantula, Shashank, Perry, Bruce, a ## Installation -1. **Clone the repository:** - ~~~ - git clone https://github.com/NatLabRockies/FuelLib.git - cd FuelLib - ~~~ +### Option 1: Install from PyPI (Recommended) -2. **Create and activate the conda environment:** - ~~~ - conda create --name fuellib-env python numpy pandas scipy matplotlib - conda activate fuellib-env - ~~~ +The easiest way to install FuelLib is via pip: -3. **Install FuelLib:** +```bash +# Basic installation +pip install fuellib - **Option A: Basic installation**: - ~~~ - pip install -e . - ~~~ +# Or with development tools (docs, testing, formatting) +pip install 'fuellib[dev]' +``` - **Option B: Full development installation** (includes documentation, testing, and formatting tools): - ~~~ - pip install -e ".[dev]" - ~~~ +This will make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available. With the `[dev]` extra, you'll also have `fl-build-docs`, `fl-clean-docs`, and `fl-format` commands. -This will install FuelLib and make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available in your environment. If you installed with `[dev]`, you can also use `fl-build-docs` and `fl-clean-docs` to manage documentation, and `fl-format` to format code. +### Option 2: Development Installation (For Contributors) + +Clone the repository and install in editable mode: + +```bash +git clone https://github.com/NatLabRockies/FuelLib.git +cd FuelLib +pip install -e . # Basic installation +# or +pip install -e ".[dev]" # Full development installation +``` + +### Optional: Create a Conda Environment + +To use a specific conda environment: + +```bash +conda create --name fuellib-env python numpy pandas scipy matplotlib +conda activate fuellib-env +pip install 'fuellib[dev]' # or pip install fuellib +``` ## Running the Code This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). diff --git a/docs/index.rst b/docs/index.rst index 2280df7..25c76af 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,42 @@ The source code is available at `github.com/NatLabRockies/FuelLib `_ page for detailed installation instructions. + +After installation, the command-line exporters will be available: + +.. code-block:: bash + + fl-export-pele -h # Export for PelePhysics simulations + fl-export-converge -h # Export for Converge simulations + fl-build-docs # Build documentation (requires [dev]) + fl-format # Format code with Black (requires [dev]) + +**Package Requirements** + +FuelLib requires: + +- **Core dependencies:** numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0 +- **Optional dependencies** (``[dev]`` extra): + - Documentation: sphinx ≥4.0, sphinx-rtd-theme ≥1.0, sphinxcontrib-bibtex ≥2.0 + - Code formatting: black ≥26.3.1 + - Testing: pytest ≥6.0 + - Plotting: matplotlib ≥3.0 + + Citing this work ---------------- diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index bf92b45..c573201 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -37,8 +37,6 @@ FuelLib File Organization - ``hefaBlends.py``: example script that calculates properties of HEFA:Jet-A blends - ``mixtureProperties.py``: validation script that calculates properties of single component fuels and mixture properties of multicomponent fuels. -- ``paths.py``: file that defines paths to various directories and files used in FuelLib - Public API ---------- diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index 97f167b..4c7bb00 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -8,6 +8,18 @@ provides a basic introduction to using FuelLib, including installation, required Download and Setup ^^^^^^^^^^^^^^^^^^ +**Option 1: Install from PyPI (Recommended)** + +Install FuelLib using pip: :: + + pip install fuellib + +Or with development tools: :: + + pip install 'fuellib[dev]' + +**Option 2: Development Installation (From Source)** + Clone the FuelLib repository from GitHub: :: git clone https://github.com/NatLabRockies/FuelLib.git From 4e90e1720f0b8983d282f37acbf1001be16d8afb Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 14:50:54 -0600 Subject: [PATCH 10/48] Update installation and docs --- .github/workflows/documentation.yml | 2 +- README.md | 28 ++++++----- docs/development.rst | 73 +++++++++++++++++++++++++++++ docs/index.rst | 66 +++++++++++--------------- docs/tutorials-basic.rst | 28 ++--------- fuellib/build_docs.py | 4 +- tests/test_source_docstrings.py | 19 ++++++-- 7 files changed, 140 insertions(+), 80 deletions(-) create mode 100644 docs/development.rst diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index ec72fa2..4492efb 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -32,7 +32,7 @@ jobs: - name: Install dependencies run: | - pip install -e ".[dev]" + pip install -e '.[dev]' - name: Build docs run: | diff --git a/README.md b/README.md index fd3ae49..f32bb22 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,10 @@ Montgomery, David, Appukuttan, Sreejith, Yellapantula, Shashank, Perry, Bruce, a The easiest way to install FuelLib is via pip: ```bash -# Basic installation pip install fuellib - -# Or with development tools (docs, testing, formatting) -pip install 'fuellib[dev]' ``` -This will make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available. With the `[dev]` extra, you'll also have `fl-build-docs`, `fl-clean-docs`, and `fl-format` commands. +This will make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available. ### Option 2: Development Installation (For Contributors) @@ -38,11 +34,11 @@ Clone the repository and install in editable mode: ```bash git clone https://github.com/NatLabRockies/FuelLib.git cd FuelLib -pip install -e . # Basic installation -# or -pip install -e ".[dev]" # Full development installation +pip install -e '.[dev]' # Install with development tools (docs, testing, formatting) ``` +See the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page for more detailed setup instructions and contribution guidelines. + ### Optional: Create a Conda Environment To use a specific conda environment: @@ -50,7 +46,7 @@ To use a specific conda environment: ```bash conda create --name fuellib-env python numpy pandas scipy matplotlib conda activate fuellib-env -pip install 'fuellib[dev]' # or pip install fuellib +pip install fuellib ``` ## Running the Code @@ -71,16 +67,22 @@ fl-export-converge -f posf10325 Run `fl-export-pele -h` or `fl-export-converge -h` for detailed usage information. # Contributing -New contributions are always welcome. If you have an idea for a new feature follow these steps: +New contributions are always welcome! For detailed contribution guidelines, installation instructions, and development setup, see the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page in the documentation. + +Quick start: 1. Fork the main repository 2. Create a `newFeature` branch that contains your changes 3. Update the sphinx documentation in `newFeature` -4. Format the source code files using the provided CLI command: +4. Install development dependencies: + ```bash + pip install -e '.[dev]' + ``` +5. Format the source code files using the provided CLI command: ~~~ fl-format ~~~ - (Requires installing with `pip install -e ".[dev]"`. Uses Black version `26.3.1`.) -5. Open a Pull Request (PR) from `newFeature` on your fork to branch `main` FuelLib repository. +6. Run tests and build documentation locally to verify your changes +7. Open a Pull Request (PR) from `newFeature` on your fork to branch `main` FuelLib repository. ## Sphinx Documentation This repository uses [Sphinx](https://www.sphinx-doc.org/en/master/usage/quickstart.html) to generate documentation. diff --git a/docs/development.rst b/docs/development.rst new file mode 100644 index 0000000..acfa8c7 --- /dev/null +++ b/docs/development.rst @@ -0,0 +1,73 @@ +Contributing to FuelLib +======================= + +We welcome contributions! This page covers how to set up your development environment, make changes, and submit pull requests. + +Development Setup +----------------- + +Clone the repository and install in editable mode with development dependencies: + +.. code-block:: bash + + git clone https://github.com/NatLabRockies/FuelLib.git + cd FuelLib + pip install -e '.[dev]' + +This installs FuelLib with all development tools: + +- **Documentation:** Sphinx, sphinx-rtd-theme, sphinxcontrib-bibtex +- **Code formatting:** Black +- **Testing:** pytest +- **Plotting:** matplotlib + +Optional: Conda Environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To use a specific conda environment: + +.. code-block:: bash + + conda create --name fuellib-env python numpy pandas scipy matplotlib + conda activate fuellib-env + pip install -e '.[dev]' + +Contributing Guidelines +----------------------- + +New contributions are always welcome! To contribute: + +1. Fork the main repository on GitHub +2. Create a new branch for your feature: ``git checkout -b newFeature`` +3. Make your changes and update documentation as needed +4. Ensure development dependencies are installed (see Development Setup above) +5. Format your code using Black: + + .. code-block:: bash + + fl-format + +6. Run tests to verify your changes: + + .. code-block:: bash + + pytest tests/ + +7. Open a Pull Request (PR) from your fork to the main FuelLib repository + +Building and Viewing Documentation Locally +------------------------------------------- + +To build the documentation after installing with ``pip install -e '.[dev]'``: + +.. code-block:: bash + + fl-build-docs + +The built documentation will be in ``docs/_build/html/``. Open ``index.html`` in your browser to view it. + +To clean the build artifacts: + +.. code-block:: bash + + fl-clean-docs diff --git a/docs/index.rst b/docs/index.rst index 25c76af..4da9144 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,43 +14,6 @@ The source code is available at `github.com/NatLabRockies/FuelLib `_ page for detailed installation instructions. - -After installation, the command-line exporters will be available: - -.. code-block:: bash - - fl-export-pele -h # Export for PelePhysics simulations - fl-export-converge -h # Export for Converge simulations - fl-build-docs # Build documentation (requires [dev]) - fl-format # Format code with Black (requires [dev]) - -**Package Requirements** - -FuelLib requires: - -- **Core dependencies:** numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0 -- **Optional dependencies** (``[dev]`` extra): - - Documentation: sphinx ≥4.0, sphinx-rtd-theme ≥1.0, sphinxcontrib-bibtex ≥2.0 - - Code formatting: black ≥26.3.1 - - Testing: pytest ≥6.0 - - Plotting: matplotlib ≥3.0 - - Citing this work ---------------- @@ -73,13 +36,40 @@ If you use FuelLib in your research, please cite the following software record: month = {feb} } +Installation +------------ + +The easiest way to install FuelLib is via pip: + +.. code-block:: bash + + pip install fuellib + +After installation, the command-line exporters for exporting fuel data will be available: + +.. code-block:: bash + + fl-export-pele -h # Export for PelePhysics simulations + fl-export-converge -h # Export for Converge simulations + +For more detailed information or development setup, see the `Contributing `_ page. + +**Package Requirements** + +FuelLib requires: + +- numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0 + +Development tools (Sphinx, Black, pytest, matplotlib) are available for developers installing from source; see the installation instructions in the tutorials section. + .. toctree:: :maxdepth: 4 :includehidden: :caption: Contents: fuelprops - sourcecode tutorials + sourcecode + development .. footbibliography:: \ No newline at end of file diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index 4c7bb00..1f900ef 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -8,33 +8,15 @@ provides a basic introduction to using FuelLib, including installation, required Download and Setup ^^^^^^^^^^^^^^^^^^ -**Option 1: Install from PyPI (Recommended)** +Install FuelLib using pip: -Install FuelLib using pip: :: +.. code-block:: bash - pip install fuellib + pip install fuellib -Or with development tools: :: +For information about contributing or development setup, see the `Contributing `_ page. - pip install 'fuellib[dev]' - -**Option 2: Development Installation (From Source)** - -Clone the FuelLib repository from GitHub: :: - - git clone https://github.com/NatLabRockies/FuelLib.git - cd FuelLib - -Create and activate a Conda environment with the required dependencies: :: - - conda create --name fuellib-env python numpy pandas scipy matplotlib - conda activate fuellib-env - -Install FuelLib: :: - - pip install -e . - -Change to the tutorials directory: :: +After installation, change to the tutorials directory to run the examples: cd tutorials diff --git a/fuellib/build_docs.py b/fuellib/build_docs.py index 7d0eff9..8f6597a 100644 --- a/fuellib/build_docs.py +++ b/fuellib/build_docs.py @@ -26,8 +26,8 @@ def main(): docs_dir = os.path.join(project_root, "docs") # Ensure fuellib is in the Python path for autodoc - if fuellib_dir not in sys.path: - sys.path.insert(0, os.path.dirname(fuellib_dir)) + if project_root not in sys.path: + sys.path.insert(0, project_root) # Build command build_cmd = [ diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index ea58fb3..b696483 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -67,16 +67,29 @@ def _iter_api_functions(module_node): class SourceDocstringContractTestCase(unittest.TestCase): def test_source_function_documentation(self): - source_dir = Path(__file__).resolve().parents[1] / "source" + fuellib_dir = Path(__file__).resolve().parents[1] / "fuellib" + + # Check main module, exporter scripts, and CLI entry points + py_files = [ + fuellib_dir / "__init__.py", + fuellib_dir / "exporters" / "pele.py", + fuellib_dir / "exporters" / "converge.py", + fuellib_dir / "build_docs.py", + fuellib_dir / "clean_docs.py", + fuellib_dir / "format_code.py", + ] + total_count = 0 passed_count = 0 current_file = None print("\n") # Add newline to separate from unittest verbose output - for py_file in sorted(source_dir.glob("*.py")): + for py_file in py_files: + if not py_file.exists(): + continue tree = ast.parse(py_file.read_text(encoding="utf-8"), filename=str(py_file)) - file_label = py_file.relative_to(source_dir.parent) + file_label = py_file.relative_to(fuellib_dir.parent) # Print file header when switching files if current_file != file_label: From 2d434b0e7060e84113f80b468425f5880f5e03fc Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 15:02:09 -0600 Subject: [PATCH 11/48] Update to 0.1.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 98018ff..6686245 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "0.1.0" +version = "0.1.1" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "Apache-2.0"} From 3e1c5f502a75d22e7e1377b3b9a21a8088afe924 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 15:24:29 -0600 Subject: [PATCH 12/48] Format and update docs --- README.md | 2 +- docs/development.rst | 10 ++++------ docs/tutorials-basic.rst | 6 +++--- docs/tutorials-export-converge.rst | 2 +- docs/tutorials-export-pele.rst | 2 +- pyproject.toml | 2 +- tests/test_source_docstrings.py | 4 ++-- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index f32bb22..2f63501 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ pip install fuellib This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). ### Command-Line Exporters -After installing FuelLib with `pip install -e .`, you can use the command-line exporters to generate fuel properties for CFD simulations: +After installing FuelLib with `pip install fuellib .`, you can use the command-line exporters to generate fuel properties for CFD simulations: - `fl-export-pele`: Export fuel properties for PelePhysics simulations - `fl-export-converge`: Export fuel properties for Converge simulations diff --git a/docs/development.rst b/docs/development.rst index acfa8c7..4cf4fbf 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -41,17 +41,15 @@ New contributions are always welcome! To contribute: 2. Create a new branch for your feature: ``git checkout -b newFeature`` 3. Make your changes and update documentation as needed 4. Ensure development dependencies are installed (see Development Setup above) -5. Format your code using Black: - - .. code-block:: bash - - fl-format +5. Format your code using Black ``fl-format`` 6. Run tests to verify your changes: .. code-block:: bash - pytest tests/ + python tests/test_api.py + python tests/test_accuracy.py + python tests/test_source_docstrings.py 7. Open a Pull Request (PR) from your fork to the main FuelLib repository diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index 1f900ef..d383426 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -14,11 +14,11 @@ Install FuelLib using pip: pip install fuellib -For information about contributing or development setup, see the `Contributing `_ page. +The required dependencies (numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0) will be installed automatically. -After installation, change to the tutorials directory to run the examples: +For information about contributing or development setup, see the `Contributing `_ page. - cd tutorials +If you want to run the example scripts, you can either clone the repository or download individual tutorial files from the `tutorials `_ directory on GitHub. Required Input Files and Decomposing Fuel Components ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/tutorials-export-converge.rst b/docs/tutorials-export-converge.rst index 4ecd11a..f2c9d99 100644 --- a/docs/tutorials-export-converge.rst +++ b/docs/tutorials-export-converge.rst @@ -33,7 +33,7 @@ This example walks through the process and the available options for exporting G Default Options ^^^^^^^^^^^^^^^ -After installing FuelLib with ``pip install -e .``, run the following command in the terminal, noting that ``--fuel_name`` is the only required input: :: +After installing FuelLib with ``pip install fuellib``, run the following command in the terminal, noting that ``--fuel_name`` is the only required input: :: fl-export-converge --fuel_name posf10325 diff --git a/docs/tutorials-export-pele.rst b/docs/tutorials-export-pele.rst index fec9b31..e512d0a 100644 --- a/docs/tutorials-export-pele.rst +++ b/docs/tutorials-export-pele.rst @@ -55,7 +55,7 @@ to Pele. Default Options ^^^^^^^^^^^^^^^ -After installing FuelLib with ``pip install -e .``, run the following command in the terminal to export +After installing FuelLib with ``pip install fuellib``, run the following command in the terminal to export the required GCM parameters. The fuel here, "heptane-decane", is a binary mixture of heptane and decane. Note that ``--fuel_name`` is the only required input: :: diff --git a/pyproject.toml b/pyproject.toml index 6686245..1c93539 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "0.1.1" +version = "0.1.1post1" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "Apache-2.0"} diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index b696483..4cb4378 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -68,7 +68,7 @@ def _iter_api_functions(module_node): class SourceDocstringContractTestCase(unittest.TestCase): def test_source_function_documentation(self): fuellib_dir = Path(__file__).resolve().parents[1] / "fuellib" - + # Check main module, exporter scripts, and CLI entry points py_files = [ fuellib_dir / "__init__.py", @@ -78,7 +78,7 @@ def test_source_function_documentation(self): fuellib_dir / "clean_docs.py", fuellib_dir / "format_code.py", ] - + total_count = 0 passed_count = 0 current_file = None From 04546b259f4f6ef9dc452890cc6d292da310051b Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 15:44:53 -0600 Subject: [PATCH 13/48] Update version for pip --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1c93539..10ad56d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "0.1.1post1" +version = "2.1.2a1" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "Apache-2.0"} From 6cc62bcb61496bd36783956325ecc8c6a6de1877 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 16:14:47 -0600 Subject: [PATCH 14/48] Update license for pip --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 10ad56d..050c8c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "2.1.2a1" +version = "2.1.2a2" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" -license = {text = "Apache-2.0"} +license = {text = "BSD-3-Clause"} authors = [ {name = "NLR", email = "david.montgomery@nlr.gov"}, ] From 31ef35b76473844750e144144d0a39c07ef1447d Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 13 May 2026 16:33:32 -0600 Subject: [PATCH 15/48] Update license for pip --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 050c8c7..7115db4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "2.1.2a2" +version = "2.1.2a3" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} @@ -16,7 +16,7 @@ keywords = ["fuel", "thermodynamics", "group-contribution", "properties"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", - "License :: OSI Approved :: Apache Software License", + "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", From b527da99aa3453c30440d8ece35486b6a6a63bca Mon Sep 17 00:00:00 2001 From: Dave Montgomery Date: Wed, 13 May 2026 17:00:31 -0600 Subject: [PATCH 16/48] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f63501..110cdd1 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ pip install fuellib This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). ### Command-Line Exporters -After installing FuelLib with `pip install fuellib .`, you can use the command-line exporters to generate fuel properties for CFD simulations: +After installing FuelLib using one of the methods above, you can use the command-line exporters to generate fuel properties for CFD simulations: - `fl-export-pele`: Export fuel properties for PelePhysics simulations - `fl-export-converge`: Export fuel properties for Converge simulations From 30bb2b9b12d8a049b4626a336971841456074af0 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 08:08:56 -0600 Subject: [PATCH 17/48] Get version from metadata --- fuellib/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index deab0ff..37bbd1f 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -10,6 +10,13 @@ import pandas as pd from scipy.optimize import curve_fit +try: + from importlib.metadata import version + + __version__ = version("fuellib") +except Exception: + __version__ = "unknown" + from ._data_locator import ( get_gcmtable_dir, get_fueldata_dir, @@ -18,7 +25,6 @@ get_fueldata_props_dir, ) -__version__ = "0.1.0" __all__ = [ "fuel", "C2K", From b4d18eff6946d6e5e1cfbb5cb7c40bdc47d70859 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 08:54:09 -0600 Subject: [PATCH 18/48] Additional command line utilities --- README.md | 36 ++++++++++++++++--- fuellib/__init__.py | 31 +++++++++++++--- fuellib/utilities/__init__.py | 1 + fuellib/utilities/temp_converter.py | 36 +++++++++++++++++++ .../utilities/transport_props_converter.py | 20 +++++++++++ pyproject.toml | 7 ++-- 6 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 fuellib/utilities/__init__.py create mode 100644 fuellib/utilities/temp_converter.py create mode 100644 fuellib/utilities/transport_props_converter.py diff --git a/README.md b/README.md index 110cdd1..82e26ab 100644 --- a/README.md +++ b/README.md @@ -52,19 +52,47 @@ pip install fuellib ## Running the Code This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). -### Command-Line Exporters -After installing FuelLib using one of the methods above, you can use the command-line exporters to generate fuel properties for CFD simulations: +### Command-Line Tools +After installing FuelLib using one of the methods above, you have access to several command-line tools: + +#### Exporters +Export fuel properties for CFD simulations: - `fl-export-pele`: Export fuel properties for PelePhysics simulations - `fl-export-converge`: Export fuel properties for Converge simulations -For example: +Example: ```bash fl-export-pele -f posf10264 fl-export-converge -f posf10325 ``` -Run `fl-export-pele -h` or `fl-export-converge -h` for detailed usage information. +Run `fl-export-pele -h` or `fl-export-converge -h` for detailed usage information. + +#### Utilities +Utility functions for combustion simulations: + +**Temperature Conversion:** +- `fl-C2K`: Convert temperature from Celsius to Kelvin +- `fl-K2C`: Convert temperature from Kelvin to Celsius + +Example: +```bash +fl-C2K 25.0 +# Output: 25.0 °C = 298.15 K + +fl-K2C 373.15 +# Output: 373.15 K = 100.00 °C +``` + +**Transport Properties:** +- `fl-eps2K`: Convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin. Useful when preparing CHEMKIN chemical mechanisms which requires the characteristic temperature (epsilon/k_B) rather than the well depth energy directly. + +Example: +```bash +fl-eps2K 4066.75 +# Output: Characteristic temperature: 489.118 K +``` # Contributing New contributions are always welcome! For detailed contribution guidelines, installation instructions, and development setup, see the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page in the documentation. diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 37bbd1f..4949208 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -25,13 +25,20 @@ get_fueldata_props_dir, ) +# Physical constants +k_B = 1.380649e-23 # Boltzmann's constant in J/K +N_A = 6.02214076e23 # Avogadro's number in 1/mol + __all__ = [ "fuel", + "k_B", + "N_A", "C2K", "K2C", "mixing_rule", "droplet_volume", "droplet_mass", + "epsilon_to_characteristic_temperature", "get_fueldata_props_dir", ] @@ -52,9 +59,6 @@ class fuel: N_g1 = 78 N_g2 = 43 - # Boltzmann's constant J/K - k_B = 1.380649e-23 - def __init__(self, name, decompName=None, fuelDataDir=None): """ Initialize the fuel object and calculate GCM properties. @@ -1036,7 +1040,26 @@ def mixture_thermal_conductivity(self, Yi, T): # ----------------------------------------------------------------------------- # Utility functions -# ------- +# ----------------------------------------------------------------------------- + + +def epsilon_to_characteristic_temperature(epsilon_j_per_mol): + """ + Convert Lennard-Jones epsilon from J/mol to characteristic temperature in Kelvin. + + The characteristic temperature (epsilon/k_B) is used in transport property + correlations and is required by combustion codes like CHEMKIN. + + Uses the relation: T* = (epsilon_J/mol) / (N_A * k_B) + + :param epsilon_j_per_mol: Lennard-Jones well depth epsilon in J/mol. + :type epsilon_j_per_mol: float + :return: Characteristic temperature (epsilon/k_B) in Kelvin. + :rtype: float + """ + epsilon_per_molecule = epsilon_j_per_mol / N_A + lj_welldepth_K = epsilon_per_molecule / k_B + return lj_welldepth_K def C2K(T): diff --git a/fuellib/utilities/__init__.py b/fuellib/utilities/__init__.py new file mode 100644 index 0000000..f219016 --- /dev/null +++ b/fuellib/utilities/__init__.py @@ -0,0 +1 @@ +"""Command-line utility tools for FuelLib.""" diff --git a/fuellib/utilities/temp_converter.py b/fuellib/utilities/temp_converter.py new file mode 100644 index 0000000..80e3be7 --- /dev/null +++ b/fuellib/utilities/temp_converter.py @@ -0,0 +1,36 @@ +"""Command-line tools to convert temperature between Celsius and Kelvin.""" + +import sys +from .. import C2K, K2C + + +def c2k_main(): + """Convert temperature from Celsius to Kelvin via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-C2K ") + print("\nConvert temperature from Celsius to Kelvin") + sys.exit(1) + + try: + temp_c = float(sys.argv[1]) + result = C2K(temp_c) + print(f"{temp_c} °C = {result:.2f} K") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) + + +def k2c_main(): + """Convert temperature from Kelvin to Celsius via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-K2C ") + print("\nConvert temperature from Kelvin to Celsius") + sys.exit(1) + + try: + temp_k = float(sys.argv[1]) + result = K2C(temp_k) + print(f"{temp_k} K = {result:.2f} °C") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) diff --git a/fuellib/utilities/transport_props_converter.py b/fuellib/utilities/transport_props_converter.py new file mode 100644 index 0000000..b806550 --- /dev/null +++ b/fuellib/utilities/transport_props_converter.py @@ -0,0 +1,20 @@ +"""Command-line tool to convert transport properties for combustion simulations.""" + +import sys +from .. import epsilon_to_characteristic_temperature + + +def eps2K_main(): + """Convert Lennard-Jones epsilon from J/mol to K via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-eps2K ") + print("\nConvert Lennard-Jones well depth epsilon from J/mol to Kelvin") + sys.exit(1) + + try: + epsilon = float(sys.argv[1]) + result = epsilon_to_characteristic_temperature(epsilon) + print(f"Characteristic temperature: {result:.3f} K") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) diff --git a/pyproject.toml b/pyproject.toml index 7115db4..4a769b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "2.1.2a3" +version = "2.1.2a4" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} @@ -50,6 +50,9 @@ fl-export-pele = "fuellib.exporters.pele:main" fl-build-docs = "fuellib.build_docs:main" fl-clean-docs = "fuellib.clean_docs:main" fl-format = "fuellib.format_code:main" +fl-eps2K = "fuellib.utilities.transport_props_converter:eps2K_main" +fl-C2K = "fuellib.utilities.temp_converter:c2k_main" +fl-K2C = "fuellib.utilities.temp_converter:k2c_main" [project.urls] Repository = "https://github.com/NatLabRockies/FuelLib" @@ -57,7 +60,7 @@ Issues = "https://github.com/NatLabRockies/FuelLib/issues" Documentation = "https://NatLabRockies.github.io/FuelLib" [tool.setuptools] -packages = ["fuellib", "fuellib.exporters"] +packages = ["fuellib", "fuellib.exporters", "fuellib.utilities"] [tool.setuptools.package-data] fuellib = [ From a13fca0d32018298250f8fe410647e79f1f76997 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 09:02:22 -0600 Subject: [PATCH 19/48] Update README links --- README.md | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 82e26ab..d115d86 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,8 @@ conda activate fuellib-env pip install fuellib ``` -## Running the Code -This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction]. The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). +## Library Usage +This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction](https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction). The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). ### Command-Line Tools After installing FuelLib using one of the methods above, you have access to several command-line tools: @@ -101,14 +101,8 @@ Quick start: 1. Fork the main repository 2. Create a `newFeature` branch that contains your changes 3. Update the sphinx documentation in `newFeature` -4. Install development dependencies: - ```bash - pip install -e '.[dev]' - ``` -5. Format the source code files using the provided CLI command: - ~~~ - fl-format - ~~~ +4. Install development dependencies: `pip install -e '.[dev]` +5. Format the source code files using the provided CLI command: `fl-format` 6. Run tests and build documentation locally to verify your changes 7. Open a Pull Request (PR) from `newFeature` on your fork to branch `main` FuelLib repository. From 231eda18578172245718a0104a1842e3abc0f1dc Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 09:10:42 -0600 Subject: [PATCH 20/48] Add CI testing for utilities --- .github/workflows/ci.yml | 12 ++++ tests/test_utilities.py | 134 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 tests/test_utilities.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28e6c03..a46bd03 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,6 +77,18 @@ jobs: pip install -e . - run: python tests/test_source_docstrings.py -v + Utilities: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - run: | + python -m pip install --upgrade pip + pip install -e '.[dev]' + - run: python -m pytest tests/test_utilities.py -v + Exporting-Scripts: runs-on: ubuntu-latest steps: diff --git a/tests/test_utilities.py b/tests/test_utilities.py new file mode 100644 index 0000000..629bceb --- /dev/null +++ b/tests/test_utilities.py @@ -0,0 +1,134 @@ +"""Tests for FuelLib utility functions and CLI commands.""" + +import subprocess +import unittest + +import fuellib as fl + + +class TestUtilityFunctions(unittest.TestCase): + """Test standalone utility functions.""" + + def test_epsilon_to_characteristic_temperature(self): + """Test epsilon conversion from J/mol to Kelvin.""" + # Test with a known value + # epsilon = 1000 J/mol + # epsilon_molecule = 1000 / 6.02214076e23 J + # T* = epsilon_molecule / k_B = (1000 / 6.02214076e23) / 1.380649e-23 K + result = fl.epsilon_to_characteristic_temperature(1000.0) + expected = (1000.0 / fl.N_A) / fl.k_B + self.assertAlmostEqual(result, expected, places=10) + + def test_epsilon_to_characteristic_temperature_zero(self): + """Test epsilon conversion with zero input.""" + result = fl.epsilon_to_characteristic_temperature(0.0) + self.assertEqual(result, 0.0) + + def test_epsilon_to_characteristic_temperature_negative(self): + """Test epsilon conversion with negative input.""" + result = fl.epsilon_to_characteristic_temperature(-1000.0) + expected = (-1000.0 / fl.N_A) / fl.k_B + self.assertAlmostEqual(result, expected, places=10) + + def test_C2K(self): + """Test Celsius to Kelvin conversion.""" + # 0°C = 273.15 K + self.assertAlmostEqual(fl.C2K(0.0), 273.15, places=10) + # 25°C = 298.15 K + self.assertAlmostEqual(fl.C2K(25.0), 298.15, places=10) + # 100°C = 373.15 K + self.assertAlmostEqual(fl.C2K(100.0), 373.15, places=10) + + def test_K2C(self): + """Test Kelvin to Celsius conversion.""" + # 273.15 K = 0°C + self.assertAlmostEqual(fl.K2C(273.15), 0.0, places=10) + # 298.15 K = 25°C + self.assertAlmostEqual(fl.K2C(298.15), 25.0, places=10) + # 373.15 K = 100°C + self.assertAlmostEqual(fl.K2C(373.15), 100.0, places=10) + + def test_C2K_K2C_roundtrip(self): + """Test roundtrip conversion between Celsius and Kelvin.""" + original_c = 42.5 + kelvin = fl.C2K(original_c) + result_c = fl.K2C(kelvin) + self.assertAlmostEqual(result_c, original_c, places=10) + + +class TestUtilityCLI(unittest.TestCase): + """Test command-line interface utilities.""" + + def _run_cli_command(self, command, *args): + """Run a CLI command and return stdout.""" + try: + result = subprocess.run( + [command] + list(args), + capture_output=True, + text=True, + timeout=5, + ) + return result.returncode, result.stdout, result.stderr + except FileNotFoundError: + self.skipTest(f"Command '{command}' not found in PATH") + + def test_fl_eps2K_basic(self): + """Test fl-eps2K CLI command.""" + returncode, stdout, stderr = self._run_cli_command("fl-eps2K", "1000.0") + self.assertEqual(returncode, 0, f"stderr: {stderr}") + self.assertIn("Characteristic temperature", stdout) + self.assertIn("K", stdout) + + def test_fl_eps2K_invalid_input(self): + """Test fl-eps2K CLI with invalid input.""" + returncode, stdout, stderr = self._run_cli_command("fl-eps2K", "not_a_number") + self.assertNotEqual(returncode, 0) + self.assertIn("Error", stdout) + + def test_fl_eps2K_no_args(self): + """Test fl-eps2K CLI with no arguments.""" + returncode, stdout, stderr = self._run_cli_command("fl-eps2K") + self.assertNotEqual(returncode, 0) + self.assertIn("Usage", stdout) + + def test_fl_C2K_basic(self): + """Test fl-C2K CLI command.""" + returncode, stdout, stderr = self._run_cli_command("fl-C2K", "25.0") + self.assertEqual(returncode, 0, f"stderr: {stderr}") + self.assertIn("298.15", stdout) + self.assertIn("K", stdout) + + def test_fl_C2K_invalid_input(self): + """Test fl-C2K CLI with invalid input.""" + returncode, stdout, stderr = self._run_cli_command("fl-C2K", "not_a_number") + self.assertNotEqual(returncode, 0) + self.assertIn("Error", stdout) + + def test_fl_C2K_no_args(self): + """Test fl-C2K CLI with no arguments.""" + returncode, stdout, stderr = self._run_cli_command("fl-C2K") + self.assertNotEqual(returncode, 0) + self.assertIn("Usage", stdout) + + def test_fl_K2C_basic(self): + """Test fl-K2C CLI command.""" + returncode, stdout, stderr = self._run_cli_command("fl-K2C", "298.15") + self.assertEqual(returncode, 0, f"stderr: {stderr}") + self.assertIn("25.00", stdout) + self.assertIn("C", stdout) + + def test_fl_K2C_invalid_input(self): + """Test fl-K2C CLI with invalid input.""" + returncode, stdout, stderr = self._run_cli_command("fl-K2C", "not_a_number") + self.assertNotEqual(returncode, 0) + self.assertIn("Error", stdout) + + def test_fl_K2C_no_args(self): + """Test fl-K2C CLI with no arguments.""" + returncode, stdout, stderr = self._run_cli_command("fl-K2C") + self.assertNotEqual(returncode, 0) + self.assertIn("Usage", stdout) + + +if __name__ == "__main__": + unittest.main() From 755f6dab7d602002fecb589058db75c3725dd9c3 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 09:13:31 -0600 Subject: [PATCH 21/48] Add eps2K to API contract --- tests/test_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_api.py b/tests/test_api.py index 55e9364..899f795 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -47,6 +47,7 @@ def test_fuellib_module_api(self): "mixing_rule": "(var_n, X, pseudo_prop='arithmetic')", "droplet_volume": "(r)", "droplet_mass": "(fuel, r, Yi, T)", + "epsilon_to_characteristic_temperature": "(epsilon_j_per_mol)", } actual = _public_module_functions(fl) From 064f32ed28cc93b32c6850d38c0292a78ea47055 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 09:23:00 -0600 Subject: [PATCH 22/48] Update file structure in docs --- docs/sourcecode.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index c573201..df24885 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -22,12 +22,18 @@ FuelLib File Organization - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) - ``pele.py``: exporter for PelePhysics simulations (CLI: ``fl-export-pele``) + - **utilities:** subpackage with CLI utility tools for data conversion + + - ``epsilon_converter.py``: convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (CLI: ``fl-eps2K``) + - ``temp_converter.py``: convert temperature between Celsius and Kelvin (CLI: ``fl-C2K``, ``fl-K2C``) + - **tests:** directory containing CI unit tests for FuelLib. The CI test checks if the cumulative error of property predictions of a new proposed model are less than or equal to the current model. - **baselinePredictions:** directory that contains baseline predictions and script ``generate_baseline.py`` for generating baseline predictions for CI testing. - ``test_accuracy.py``: unit test used in CI for verifying new model predictions preserve accuracy - ``test_source_docstrings.py``: documentation contract test that checks public source functions include required docstring fields (``:param:``, ``:type:``, ``:return:``, ``:rtype:``). - ``test_api.py``: combined API/signature and function-evaluation test that checks public ``FuelLib.py`` module and class method signatures for unexpected API drift and runs representative FuelLib smoke evaluations. + - ``test_utilities.py``: unit test for utility functions and CLI commands including temperature conversion and transport property calculations. - ``get_pred_and_data.py``: helper function used by ``test_accuracy.py`` and ``baselinePredictions/generate_baseline.py`` to compute predictions and load validation data. - **tutorials:** directory containing example scripts that demonstrate how to use FuelLib From 83a0e5b9c004435306eebbffc6c0d0b44539f044 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Thu, 14 May 2026 17:07:49 -0600 Subject: [PATCH 23/48] Simplify custom fuels and add more CLI plotting - Rewrite tutorials-custom-fuels.rst for clarity - Add fuel_metadata requirement - Update error messages and fuel manager - Add fl-fuels command to README - Add testing for fuels shipped with FuelLib --- .github/workflows/ci.yml | 12 + .gitignore | 3 + README.md | 50 +- docs/sourcecode.rst | 8 +- docs/tutorials-basic.rst | 8 +- docs/tutorials-custom-fuels.rst | 133 +++ docs/tutorials.rst | 1 + fuelData/dataReferences.md | 52 -- fuelData/gcData/decane_init.csv | 2 - fuelData/gcData/dodecane_init.csv | 2 - fuelData/gcData/hefa-came_init.csv | 68 -- fuelData/gcData/hefa-mfat_init.csv | 68 -- fuelData/gcData/hefa-tall_init.csv | 68 -- fuelData/gcData/heptane-decane_init.csv | 3 - fuelData/gcData/heptane_init.csv | 2 - fuelData/gcData/jet-a_init.csv | 68 -- fuelData/gcData/posf10264_init.csv | 68 -- fuelData/gcData/posf10289_init.csv | 68 -- fuelData/gcData/posf10325_init.csv | 68 -- fuelData/gcData/posf11498_init.csv | 14 - fuelData/gcData/posf4658_init.csv | 68 -- fuelData/groupDecompositionData/decane.csv | 2 - fuelData/groupDecompositionData/dodecane.csv | 2 - fuelData/groupDecompositionData/hefa.csv | 68 -- .../groupDecompositionData/heptane-decane.csv | 3 - fuelData/groupDecompositionData/heptane.csv | 2 - fuelData/groupDecompositionData/jet-a.csv | 68 -- fuelData/groupDecompositionData/posf10264.csv | 68 -- fuelData/groupDecompositionData/posf10289.csv | 68 -- fuelData/groupDecompositionData/posf10325.csv | 68 -- fuelData/groupDecompositionData/posf11498.csv | 14 - fuelData/groupDecompositionData/posf4658.csv | 68 -- .../groupDecompositionData/refCompounds.csv | 90 --- fuelData/propertiesData/decane.csv | 37 - fuelData/propertiesData/dodecane.csv | 33 - fuelData/propertiesData/hefa-jet-a-blends.csv | 10 - fuelData/propertiesData/heptane.csv | 39 - fuelData/propertiesData/posf10264.csv | 22 - fuelData/propertiesData/posf10289.csv | 24 - fuelData/propertiesData/posf10325.csv | 22 - fuelData/propertiesData/posf11498.csv | 22 - fuelData/refCompounds.csv | 90 --- fuellib/__init__.py | 63 +- fuellib/_data_locator.py | 94 +++ fuellib/data/fuelData/fuel_metadata.yaml | 115 +++ fuellib/data/fuelData/gcData/decane_init.csv | 4 +- .../data/fuelData/gcData/dodecane_init.csv | 4 +- fuellib/data/fuelData/gcData/hefa-S1_init.csv | 3 - .../gcData/hefa-WE-SAF-262714_init.csv | 33 - .../data/fuelData/gcData/hefa-came_init.csv | 136 ++-- .../data/fuelData/gcData/hefa-mfat_init.csv | 136 ++-- .../data/fuelData/gcData/hefa-tall_init.csv | 136 ++-- .../fuelData/gcData/heptane-decane_init.csv | 6 +- fuellib/data/fuelData/gcData/heptane_init.csv | 4 +- fuellib/data/fuelData/gcData/jet-a_init.csv | 136 ++-- .../fuelData/gcData/posf10264_T30_init.csv | 68 -- .../data/fuelData/gcData/posf10264_init.csv | 136 ++-- .../data/fuelData/gcData/posf10289_init.csv | 136 ++-- .../data/fuelData/gcData/posf10325_init.csv | 136 ++-- .../data/fuelData/gcData/posf11498_init.csv | 28 +- .../data/fuelData/gcData/posf4658_init.csv | 136 ++-- .../groupDecompositionData/hefa-S1.csv | 3 - .../hefa-WE-SAF-262714.csv | 33 - fuellib/exporters/converge.py | 13 +- fuellib/exporters/pele.py | 18 +- fuellib/utilities/fuel_manager.py | 144 ++++ fuellib/utilities/plotting.py | 758 ++++++++++++++++++ pyproject.toml | 4 + tests/test_hc_identification.py | 276 +++++++ tutorials/compositionPlots.py | 188 +++-- 70 files changed, 2320 insertions(+), 2281 deletions(-) create mode 100644 docs/tutorials-custom-fuels.rst delete mode 100644 fuelData/dataReferences.md delete mode 100644 fuelData/gcData/decane_init.csv delete mode 100644 fuelData/gcData/dodecane_init.csv delete mode 100644 fuelData/gcData/hefa-came_init.csv delete mode 100644 fuelData/gcData/hefa-mfat_init.csv delete mode 100644 fuelData/gcData/hefa-tall_init.csv delete mode 100644 fuelData/gcData/heptane-decane_init.csv delete mode 100644 fuelData/gcData/heptane_init.csv delete mode 100644 fuelData/gcData/jet-a_init.csv delete mode 100644 fuelData/gcData/posf10264_init.csv delete mode 100644 fuelData/gcData/posf10289_init.csv delete mode 100644 fuelData/gcData/posf10325_init.csv delete mode 100644 fuelData/gcData/posf11498_init.csv delete mode 100644 fuelData/gcData/posf4658_init.csv delete mode 100644 fuelData/groupDecompositionData/decane.csv delete mode 100644 fuelData/groupDecompositionData/dodecane.csv delete mode 100644 fuelData/groupDecompositionData/hefa.csv delete mode 100644 fuelData/groupDecompositionData/heptane-decane.csv delete mode 100644 fuelData/groupDecompositionData/heptane.csv delete mode 100644 fuelData/groupDecompositionData/jet-a.csv delete mode 100644 fuelData/groupDecompositionData/posf10264.csv delete mode 100644 fuelData/groupDecompositionData/posf10289.csv delete mode 100644 fuelData/groupDecompositionData/posf10325.csv delete mode 100644 fuelData/groupDecompositionData/posf11498.csv delete mode 100644 fuelData/groupDecompositionData/posf4658.csv delete mode 100755 fuelData/groupDecompositionData/refCompounds.csv delete mode 100644 fuelData/propertiesData/decane.csv delete mode 100644 fuelData/propertiesData/dodecane.csv delete mode 100644 fuelData/propertiesData/hefa-jet-a-blends.csv delete mode 100644 fuelData/propertiesData/heptane.csv delete mode 100644 fuelData/propertiesData/posf10264.csv delete mode 100644 fuelData/propertiesData/posf10289.csv delete mode 100644 fuelData/propertiesData/posf10325.csv delete mode 100755 fuelData/propertiesData/posf11498.csv delete mode 100644 fuelData/refCompounds.csv create mode 100644 fuellib/data/fuelData/fuel_metadata.yaml delete mode 100644 fuellib/data/fuelData/gcData/hefa-S1_init.csv delete mode 100644 fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv delete mode 100644 fuellib/data/fuelData/gcData/posf10264_T30_init.csv delete mode 100644 fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv delete mode 100644 fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv create mode 100644 fuellib/utilities/fuel_manager.py create mode 100644 fuellib/utilities/plotting.py create mode 100644 tests/test_hc_identification.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a46bd03..80581bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,6 +89,18 @@ jobs: pip install -e '.[dev]' - run: python -m pytest tests/test_utilities.py -v + Hydrocarbon-Identification: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - run: | + python -m pip install --upgrade pip + pip install -e '.[dev]' + - run: python -m pytest tests/test_hc_identification.py -v -s + Exporting-Scripts: runs-on: ubuntu-latest steps: diff --git a/.gitignore b/.gitignore index a337898..31587ed 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ build/ env/ venv/ +# Figures from plotting tools +composition_*.png +mixture_*.png diff --git a/README.md b/README.md index d115d86..4ca0025 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ pip install fuellib ``` ## Library Usage -This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, `tutorials/basic.py`, which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction](https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction). The script `tutorials/mixtureProperties.py` calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). +This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, [`tutorials/basic.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/basic.py), which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction](https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction). The script [`tutorials/mixtureProperties.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/mixtureProperties.py) calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). ### Command-Line Tools After installing FuelLib using one of the methods above, you have access to several command-line tools: @@ -75,24 +75,40 @@ Utility functions for combustion simulations: **Temperature Conversion:** - `fl-C2K`: Convert temperature from Celsius to Kelvin - `fl-K2C`: Convert temperature from Kelvin to Celsius - -Example: -```bash -fl-C2K 25.0 -# Output: 25.0 °C = 298.15 K - -fl-K2C 373.15 -# Output: 373.15 K = 100.00 °C -``` + ```bash + fl-C2K 25.0 + # Output: 25.0 °C = 298.15 K + fl-K2C 373.15 + # Output: 373.15 K = 100.00 °C + ``` **Transport Properties:** -- `fl-eps2K`: Convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin. Useful when preparing CHEMKIN chemical mechanisms which requires the characteristic temperature (epsilon/k_B) rather than the well depth energy directly. - -Example: -```bash -fl-eps2K 4066.75 -# Output: Characteristic temperature: 489.118 K -``` +- `fl-eps2K`: Convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (for CHEMKIN chemical mechanisms) + ```bash + fl-eps2K 4066.75 + # Output: Characteristic temperature: 489.118 K + ``` + +**Available Fuels:** +- `fl-fuels`: List all available fuels in the library (built-in and custom) + ```bash + fl-fuels # Simple list + fl-fuels -v # Detailed listing with metadata + fl-fuels -dir path/to/custom/fuelData # List custom fuels + ``` + +**Analysis & Visualization:** + +- `fl-plt-comp`: Plot fuel composition by compound and chemical family + ```bash + fl-plt-comp -f posf10264 + ``` + +- `fl-plt-props`: Plot mixture properties (density, viscosity, vapor pressure, surface tension, thermal conductivity) vs. temperature + ```bash + fl-plt-props -f posf10264 + fl-plt-props -f posf10264 posf10325 posf10289 # Multiple fuels + ``` # Contributing New contributions are always welcome! For detailed contribution guidelines, installation instructions, and development setup, see the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page in the documentation. diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index df24885..b6e0e29 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -22,10 +22,14 @@ FuelLib File Organization - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) - ``pele.py``: exporter for PelePhysics simulations (CLI: ``fl-export-pele``) - - **utilities:** subpackage with CLI utility tools for data conversion + - **utilities:** subpackage with CLI utility tools for data conversion and analysis - - ``epsilon_converter.py``: convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (CLI: ``fl-eps2K``) + - ``transport_props_converter.py``: convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (CLI: ``fl-eps2K``) - ``temp_converter.py``: convert temperature between Celsius and Kelvin (CLI: ``fl-C2K``, ``fl-K2C``) + - ``plotting.py``: plot fuel composition and mixture properties + + - ``plot_composition()``: plot fuel composition by compound and chemical family (CLI: ``fl-plt-comp``) + - ``plot_mixture_properties()``: plot mixture properties over temperature range with optional experimental data (CLI: ``fl-plt-props``) - **tests:** directory containing CI unit tests for FuelLib. The CI test checks if the cumulative error of property predictions of a new proposed model are less than or equal to the current model. diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index d383426..e5aefb7 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -20,8 +20,8 @@ For information about contributing or development setup, see the `Contributing < If you want to run the example scripts, you can either clone the repository or download individual tutorial files from the `tutorials `_ directory on GitHub. -Required Input Files and Decomposing Fuel Components -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Required Input Files +^^^^^^^^^^^^^^^^^^^^^ FuelLib requires two input files for any given fuel, ````: @@ -30,6 +30,10 @@ FuelLib requires two input files for any given fuel, ````: These two required files must have the same number of rows and the same order of components. Many examples can be found in the `fuelData `_ directory. +**Fuel Metadata** + +For custom fuels, a ``fuel_metadata.yaml`` file is required to define decomposition name mappings. This allows you to map fuel variants to the correct group decomposition file. See the `Adding Custom Fuels `_ tutorial for details on the metadata file format and structure. + Decomposing Fuel Components into Fundamental Groups ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/tutorials-custom-fuels.rst b/docs/tutorials-custom-fuels.rst new file mode 100644 index 0000000..dbe2243 --- /dev/null +++ b/docs/tutorials-custom-fuels.rst @@ -0,0 +1,133 @@ +Adding Custom Fuels +==================== + +This tutorial explains how to add custom fuels to FuelLib. Custom fuels allow you to use your own fuel composition and property data with the FuelLib calculations and plotting tools. + +Directory Structure +------------------- + +Create a fuel data directory with this structure: + +.. code-block:: text + + your_fueldata_dir/ + ├── gcData/ + │ └── your_fuel_name_init.csv + ├── groupDecompositionData/ + │ └── your_fuel_name.csv + └── fuel_metadata.yaml + +**Required subdirectories:** + +- ``gcData/``: Contains GC×GC composition data (one file per fuel) +- ``groupDecompositionData/``: Contains functional group decomposition data (one file per fuel) + +**Required file:** + +- ``fuel_metadata.yaml``: Configuration file that maps fuel names to their decomposition files + +Metadata Configuration +---------------------- + +Each custom fuel directory must have a ``fuel_metadata.yaml`` file at the root of the ``fuelData`` directory. This file defines the mapping from fuel names to their group decomposition files. + +**Minimal format:** + +.. code-block:: yaml + + fuels: + your_fuel: + decomp_name: your_fuel + +**Fields:** + +- ``decomp_name`` (required): Name of the decomposition CSV file (without ``.csv`` extension). Must match a file in ``groupDecompositionData/`` + +**Optional fields:** + +You can add additional metadata for documentation: + +.. code-block:: yaml + + fuels: + your_fuel: + name: Display Name for Your Fuel + category: Conventional|SATF|Simple + source: Citation or origin of fuel data + reference: URL to source paper + description: Brief description of the fuel + decomp_name: your_fuel + +Note that you can assign the same decomposition to multiple fuel variants if they have identical bulk composition. + +GCxGC Composition Data +---------------------- + +Create a file named ``{fuel_name}_init.csv`` in the ``gcData/`` directory with fuel composition data. + +**Required columns:** + +- ``Compound``: Name of each component +- ``Weight %``: Weight percentage of each component + +**Example:** + +.. code-block:: text + + Compound,Weight % + n-Decane,60 + n-Dodecane,40 + +Group Decomposition Data +------------------------ + +Create a file named ``{decomp_name}.csv`` in the ``groupDecompositionData/`` directory with functional group decompositions for each compound. + +See the `Basic Usage tutorial `_ for detailed information on group decompositions. + + +Using Custom Fuels +------------------ + +Once your fuel data directory is set up, you can use it like any built-in fuel: + +.. code-block:: python + + import fuellib as fl + + # Load a custom fuel + fuel = fl.fuel("new-satf", fuelDataDir="/path/to/custom_fuels") + + # Display fuel name, components, initial composition, and critical temperature + print(f"Fuel name: {fuel.name}") + print(f"Fuel components: {fuel.compounds}") + print(f"Initial composition: {fuel.Y_0}") + print(f"Critical temperature: {fuel.Tc} K") + + # Calculate the saturated vapor pressure at 320 K + T = 320 # K + p_sat_i = fuel.psat(T) + p_sat_mix = fuel.mixture_vapor_pressure(fuel.Y_0, T) + print(f"Saturated vapor pressure at {T} K: {p_sat_i} Pa") + print(f"Mixture saturated vapor pressure at {T} K: {p_sat_mix:.2f} Pa") + +Tips and Best Practices +----------------------- + +1. **Composition Normalization**: Weight percentages don't need to sum to exactly 100% - FuelLib normalizes them automatically. + +2. **Group Decomposition Accuracy**: Predictions depend heavily on decomposition quality. When possible: + - Use literature values or validated decompositions + - Validate against measured properties + - Document your decomposition sources + +3. **Fuel Variants**: Use ``decomp_name`` to map multiple fuel variants to the same decomposition file when they have identical bulk composition: + + .. code-block:: yaml + + fuels: + fuel_1: + decomp_name: fuel_decomp_1_and_2 + + fuel_2: + decomp_name: fuel_decomp_1_and_2 diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 99c47f3..d7c1f9a 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -7,6 +7,7 @@ This section provides tutorials on how to use the FuelLib library. :maxdepth: 4 tutorials-basic + tutorials-custom-fuels tutorials-export-pele tutorials-export-converge diff --git a/fuelData/dataReferences.md b/fuelData/dataReferences.md deleted file mode 100644 index 6330140..0000000 --- a/fuelData/dataReferences.md +++ /dev/null @@ -1,52 +0,0 @@ -## References for fuel data - -# GCxGC Data -The provided GC x GC data is for the weight % of the fuel. - -## POSF Fuels -The GCxGC data for the POSF fuels comes from the [National Jet Fuels Combustion Program](https://doi.org/10.2514/1.J055361) (NJFCP) as provided by the Air Force Research Laboratory in [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf) and [Edwards (2017)](https://doi.org/10.2514/6.2017-0146): -* gcData/posf4658_init.csv (from Appendix D [Edwards (2017)](https://doi.org/10.2514/6.2017-0146)) -* gcData/posf10264_init.csv -* gcData/posf10289_init.csv -* gcData/posf10325_init.csv -* gcData/posf11498_init.csv - -## HEFA:Jet-A Blends -GCxGC data for HEFA fuels produced from different feedstocks (camelina, tallow, and mixed fat) courtesy of [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787). Note that these can be blended with Jet-A to reproduce the density and viscosity measurement data from that paper: -* gcData/hefa-came.csv -* gcData/hefa-tall.csv -* gcData/hefa-mfat.csv -* gcData/jet-a.csv - -# Group Decomposition Data - -## POSF Fuels -The decompositions of each compound into its functional groups for the POSF fuels originated from [Govindaraju & Ihme (2016)](https://doi.org/10.1016/j.ijheatmasstransfer.2016.06.079), but have been updated for additional accuracy and to include the specific reference compounds used: -* groupDecompositionData/posf4658.csv -* groupDecompositionData/posf10264.csv -* groupDecompositionData/posf10289.csv -* groupDecompositionData/posf10325.csv -* groupDecompositionData/posf11498.csv - -## HEFA:Jet-A Blends -The group decompositions of the HEFA and Jet-A from [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787) have been derived from the `posf10325` decomposition: -* groupDecompositionData/hefa.csv -* groupDecompositionData/jet-a.csv - -# Fuel Properties Data -## Single Component Fuels -The properties data for the single component fuels is from [NIST WebBook](https://webbook.nist.gov/chemistry/): -* propertiesData/decane-NIST.csv -* propertiesData/dodecane-NIST.csv -* propertiesData/heptane-NIST.csv - -## POSF Fuels -The properties data for POSF fuels is from the AFRL [Edwards (2017)](https://doi.org/10.2514/6.2017-0146) and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf): -* propertiesData/posf10264.csv -* propertiesData/posf10289.csv -* propertiesData/posf10325.csv -* propertiesData/posf11498.csv - -## HEFA:Jet-A Blends -The properties data for the HEFA:Jet-A blends are from [Vozka et al. (2018)](https://doi.org/10.1021/acs.energyfuels.8b02787) -* propertiesData/hefa-jet-a-blends.csv \ No newline at end of file diff --git a/fuelData/gcData/decane_init.csv b/fuelData/gcData/decane_init.csv deleted file mode 100644 index b0d0709..0000000 --- a/fuelData/gcData/decane_init.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,Weight % -NC10H22,100 \ No newline at end of file diff --git a/fuelData/gcData/dodecane_init.csv b/fuelData/gcData/dodecane_init.csv deleted file mode 100644 index a9a068e..0000000 --- a/fuelData/gcData/dodecane_init.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,Weight % -NC12H26,100 \ No newline at end of file diff --git a/fuelData/gcData/hefa-came_init.csv b/fuelData/gcData/hefa-came_init.csv deleted file mode 100644 index 527882a..0000000 --- a/fuelData/gcData/hefa-came_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0 -C2-Benzene,ethyl benzene ,C6H5C2H5,0.01 -C3-Benzene,propyl benzene,C6H5C3H7,0.02 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0 -C08-Isoparaffin,2-methyl heptane,C8H18-2,1.51 -C09-Isoparaffin,2-methyl octane,C9H20-2,11.09 -C10-Isoparaffin,2-methyl nonane,C10H22-2,11.1 -C11-Isoparaffin,2-methyl decane,C11H24-2,9.62 -C12-Isoparaffin,2-methyl undecane,C12H26-2,8.27 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,8.33 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,6.39 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,5.42 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,2.14 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,21.58 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,4.71 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.83 -n-C09,n-nonane,NC9H20,1.92 -n-C10,n-decane,NC10H22,1.4 -n-C11,n-undecane,NC11H24,0.84 -n-C12,n-dodecane,NC12H26,0.59 -n-C13,n-tridecane,NC13H28,0.49 -n-C14,n-tetradecane,NC14H30,0.23 -n-C15,n-pentadecane,NC15H32,0.46 -n-C16,n-hexadecane (cetane),NC16H34,0.2 -n-C17,n-heptadecane,NC17H36,0.12 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.1 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.94 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.52 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.15 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.04 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.01 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuelData/gcData/hefa-mfat_init.csv b/fuelData/gcData/hefa-mfat_init.csv deleted file mode 100644 index 2c196c9..0000000 --- a/fuelData/gcData/hefa-mfat_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.01 -C2-Benzene,ethyl benzene ,C6H5C2H5,0 -C3-Benzene,propyl benzene,C6H5C3H7,0.01 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 -C08-Isoparaffin,2-methyl heptane,C8H18-2,1.77 -C09-Isoparaffin,2-methyl octane,C9H20-2,3.65 -C10-Isoparaffin,2-methyl nonane,C10H22-2,6.69 -C11-Isoparaffin,2-methyl decane,C11H24-2,10.33 -C12-Isoparaffin,2-methyl undecane,C12H26-2,12.37 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,11.54 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,13.98 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,4.29 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,20.73 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.29 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,3.44 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1 -n-C10,n-decane,NC10H22,1.42 -n-C11,n-undecane,NC11H24,1.36 -n-C12,n-dodecane,NC12H26,1.44 -n-C13,n-tridecane,NC13H28,0.87 -n-C14,n-tetradecane,NC14H30,1.67 -n-C15,n-pentadecane,NC15H32,0.18 -n-C16,n-hexadecane (cetane),NC16H34,0.7 -n-C17,n-heptadecane,NC17H36,0.01 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.07 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.76 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.41 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.27 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.14 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0.02 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0.01 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuelData/gcData/hefa-tall_init.csv b/fuelData/gcData/hefa-tall_init.csv deleted file mode 100644 index 75bebde..0000000 --- a/fuelData/gcData/hefa-tall_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0 -C2-Benzene,ethyl benzene ,C6H5C2H5,0 -C3-Benzene,propyl benzene,C6H5C3H7,0 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.06 -C09-Isoparaffin,2-methyl octane,C9H20-2,6.13 -C10-Isoparaffin,2-methyl nonane,C10H22-2,12.14 -C11-Isoparaffin,2-methyl decane,C11H24-2,12.6 -C12-Isoparaffin,2-methyl undecane,C12H26-2,13.52 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,12.69 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,8.75 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,21.74 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,4.13 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.1 -n-C09,n-nonane,NC9H20,1.84 -n-C10,n-decane,NC10H22,1.69 -n-C11,n-undecane,NC11H24,1.33 -n-C12,n-dodecane,NC12H26,1.12 -n-C13,n-tridecane,NC13H28,0.86 -n-C14,n-tetradecane,NC14H30,0.56 -n-C15,n-pentadecane,NC15H32,0.32 -n-C16,n-hexadecane (cetane),NC16H34,0 -n-C17,n-heptadecane,NC17H36,0 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.22 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.18 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.02 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.01 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuelData/gcData/heptane-decane_init.csv b/fuelData/gcData/heptane-decane_init.csv deleted file mode 100644 index 70680b1..0000000 --- a/fuelData/gcData/heptane-decane_init.csv +++ /dev/null @@ -1,3 +0,0 @@ -Compound,Weight % -NC7H16,73.75 -NC10H22,26.25 \ No newline at end of file diff --git a/fuelData/gcData/heptane_init.csv b/fuelData/gcData/heptane_init.csv deleted file mode 100644 index d57c668..0000000 --- a/fuelData/gcData/heptane_init.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,Weight % -NC7H16,100 \ No newline at end of file diff --git a/fuelData/gcData/jet-a_init.csv b/fuelData/gcData/jet-a_init.csv deleted file mode 100644 index 07d4e30..0000000 --- a/fuelData/gcData/jet-a_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.07 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.79 -C3-Benzene,propyl benzene,C6H5C3H7,4.54 -C4-Benzene,butyl benzene,C6H5C4H9,3.27 -C5-Benzene,pentyl benzene,C6H5C5H11,2.73 -C6-Benzene,hexyl benzene,C6H5C6H13,1.76 -C7-Benzene,heptyl benzene,C6H5C7H15,0.98 -C8-Benzene,octyl benzene,C6H5C8H17,0.47 -C9-Benzene,nonyl benzene,C6H5C9H19,0.15 -Diaromatic-C10,naphthalene,NAPH,0.11 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.44 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.63 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.51 -Cycloaromatic-C09,indane,INDANE,0.14 -Cycloaromatic-C10,tetralin,TETRA,0.45 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,2.43 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.21 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.46 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.42 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.31 -C09-Isoparaffin,2-methyl octane,C9H20-2,4.12 -C10-Isoparaffin,2-methyl nonane,C10H22-2,6.63 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.02 -C12-Isoparaffin,2-methyl undecane,C12H26-2,3.21 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,2.95 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,2.39 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,1.66 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.87 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.19 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.08 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.67 -n-C09,n-nonane,NC9H20,4.42 -n-C10,n-decane,NC10H22,4.73 -n-C11,n-undecane,NC11H24,3.44 -n-C12,n-dodecane,NC12H26,2.49 -n-C13,n-tridecane,NC13H28,1.93 -n-C14,n-tetradecane,NC14H30,1.31 -n-C15,n-pentadecane,NC15H32,0.79 -n-C16,n-hexadecane (cetane),NC16H34,0.38 -n-C17,n-heptadecane,NC17H36,0.09 -n-C18,n-octadecane,NC18H38,0.02 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.19 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,5.81 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,5.26 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.58 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,2.82 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.5 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,1.53 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0.65 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.02 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.86 -C09-Dicycloparaffin,Hydrindane,HYDRIND,1.21 -C10-Dicycloparaffin,Decalin,DECALIN,1.05 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.8 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.27 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.09 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuelData/gcData/posf10264_init.csv b/fuelData/gcData/posf10264_init.csv deleted file mode 100644 index 6b89316..0000000 --- a/fuelData/gcData/posf10264_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.25 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.98 -C3-Benzene,propyl benzene,C6H5C3H7,4.17 -C4-Benzene,butyl benzene,C6H5C4H9,2.33 -C5-Benzene,pentyl benzene,C6H5C5H11,1.19 -C6-Benzene,hexyl benzene,C6H5C6H13,0.66 -C7-Benzene,heptyl benzene,C6H5C7H15,0.25 -C8-Benzene,octyl benzene,C6H5C8H17,0.12 -C9-Benzene,nonyl benzene,C6H5C9H19,0.06 -Diaromatic-C10,naphthalene,NAPH,0.10 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.41 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.22 -Cycloaromatic-C09,indane,INDANE,0.02 -Cycloaromatic-C10,tetralin,TETRA,0.19 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.37 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.38 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.34 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.19 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.21 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.88 -C09-Isoparaffin,2-methyl octane,C9H20-2,2.59 -C10-Isoparaffin,2-methyl nonane,C10H22-2,8.15 -C11-Isoparaffin,2-methyl decane,C11H24-2,8.38 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.41 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.63 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.96 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.28 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.75 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.20 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.03 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 -n-C07,n-heptane,NC7H16,0.24 -n-C08,n-octane,NC8H18,1.11 -n-C09,n-nonane,NC9H20,2.97 -n-C10,n-decane,NC10H22,6.46 -n-C11,n-undecane,NC11H24,5.22 -n-C12,n-dodecane,NC12H26,3.99 -n-C13,n-tridecane,NC13H28,2.97 -n-C14,n-tetradecane,NC14H30,1.97 -n-C15,n-pentadecane,NC15H32,0.83 -n-C16,n-hexadecane (cetane),NC16H34,0.23 -n-C17,n-heptadecane,NC17H36,0.06 -n-C18,n-octadecane,NC18H38,0.00 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.51 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.01 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,3.06 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.47 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,3.55 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.45 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,2.25 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,1.19 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.77 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.11 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.02 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.35 -C10-Dicycloparaffin,Decalin,DECALIN,0.47 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.71 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.77 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.52 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.45 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.08 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.11 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuelData/gcData/posf10289_init.csv b/fuelData/gcData/posf10289_init.csv deleted file mode 100644 index c4092b1..0000000 --- a/fuelData/gcData/posf10289_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.03 -C2-Benzene,ethyl benzene ,C6H5C2H5,0.41 -C3-Benzene,propyl benzene,C6H5C3H7,1.32 -C4-Benzene,butyl benzene,C6H5C4H9,2.09 -C5-Benzene,pentyl benzene,C6H5C5H11,1.98 -C6-Benzene,hexyl benzene,C6H5C6H13,1.80 -C7-Benzene,heptyl benzene,C6H5C7H15,1.24 -C8-Benzene,octyl benzene,C6H5C8H17,1.05 -C9-Benzene,nonyl benzene,C6H5C9H19,0.42 -Diaromatic-C10,naphthalene,NAPH,0.09 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.33 -Cycloaromatic-C09,indane,INDANE,0.03 -Cycloaromatic-C10,tetralin,TETRA,0.57 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.91 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.67 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,2.27 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.22 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.13 -C09-Isoparaffin,2-methyl octane,C9H20-2,0.48 -C10-Isoparaffin,2-methyl nonane,C10H22-2,1.66 -C11-Isoparaffin,2-methyl decane,C11H24-2,2.73 -C12-Isoparaffin,2-methyl undecane,C12H26-2,3.36 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,3.57 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.54 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.70 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.65 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.08 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.00 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 -n-C07,n-heptane,NC7H16,0.02 -n-C08,n-octane,NC8H18,0.19 -n-C09,n-nonane,NC9H20,0.64 -n-C10,n-decane,NC10H22,1.41 -n-C11,n-undecane,NC11H24,2.60 -n-C12,n-dodecane,NC12H26,3.09 -n-C13,n-tridecane,NC13H28,2.50 -n-C14,n-tetradecane,NC14H30,1.92 -n-C15,n-pentadecane,NC15H32,0.86 -n-C16,n-hexadecane (cetane),NC16H34,0.11 -n-C17,n-heptadecane,NC17H36,0.01 -n-C18,n-octadecane,NC18H38,0.00 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.08 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.35 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.53 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.25 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.77 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,6.25 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,6.11 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,4.22 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,2.27 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.41 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.01 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.46 -C10-Dicycloparaffin,Decalin,DECALIN,1.04 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,2.84 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,4.33 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,4.53 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,3.14 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.67 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.10 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuelData/gcData/posf10325_init.csv b/fuelData/gcData/posf10325_init.csv deleted file mode 100644 index 7bd11cf..0000000 --- a/fuelData/gcData/posf10325_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.17 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.10 -C3-Benzene,propyl benzene,C6H5C3H7,2.97 -C4-Benzene,butyl benzene,C6H5C4H9,3.32 -C5-Benzene,pentyl benzene,C6H5C5H11,2.22 -C6-Benzene,hexyl benzene,C6H5C6H13,1.45 -C7-Benzene,heptyl benzene,C6H5C7H15,0.73 -C8-Benzene,octyl benzene,C6H5C8H17,0.52 -C9-Benzene,nonyl benzene,C6H5C9H19,0.42 -Diaromatic-C10,naphthalene,NAPH,0.22 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.66 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.86 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.60 -Cycloaromatic-C09,indane,INDANE,0.02 -Cycloaromatic-C10,tetralin,TETRA,0.26 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.66 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.89 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.85 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.61 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.15 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.44 -C09-Isoparaffin,2-methyl octane,C9H20-2,1.05 -C10-Isoparaffin,2-methyl nonane,C10H22-2,4.20 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.70 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.63 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.22 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.20 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.51 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.00 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.39 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.11 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.03 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.03 -n-C07,n-heptane,NC7H16,0.17 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1.42 -n-C10,n-decane,NC10H22,3.26 -n-C11,n-undecane,NC11H24,4.29 -n-C12,n-dodecane,NC12H26,3.74 -n-C13,n-tridecane,NC13H28,2.80 -n-C14,n-tetradecane,NC14H30,2.02 -n-C15,n-pentadecane,NC15H32,1.03 -n-C16,n-hexadecane (cetane),NC16H34,0.43 -n-C17,n-heptadecane,NC17H36,0.21 -n-C18,n-octadecane,NC18H38,0.06 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.36 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.78 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,2.30 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.11 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.43 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,3.73 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,4.19 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.19 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.33 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.42 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.24 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.43 -C10-Dicycloparaffin,Decalin,DECALIN,0.72 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.52 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.57 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.21 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.81 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.27 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.16 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuelData/gcData/posf11498_init.csv b/fuelData/gcData/posf11498_init.csv deleted file mode 100644 index fd876d2..0000000 --- a/fuelData/gcData/posf11498_init.csv +++ /dev/null @@ -1,14 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.61 -C09-Isoparaffin,2-methyl octane,C9H20-2,0.17 -C10-Isoparaffin,2-methyl nonane,C10H22-2,0.22 -C11-Isoparaffin,2-methyl decane,C11H24-2,0.52 -C12-Isoparaffin,2-methyl undecane,C12H26-2,78.28 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,1.23 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,0.53 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,16.25 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,1.69 -C24-Isoparaffin,2-methyltricosane,C24H50-2,0.12 -C12-Alkene,1-dodecene,DODECENE-1,0.08 -C16-Alkene,1-hexadecene,HEXADECENE-1,0.24 \ No newline at end of file diff --git a/fuelData/gcData/posf4658_init.csv b/fuelData/gcData/posf4658_init.csv deleted file mode 100644 index 2f1d77b..0000000 --- a/fuelData/gcData/posf4658_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.16 -C2-Benzene,ethyl benzene,C6H5C2H5,0.78 -C3-Benzene,propyl benzene,C6H5C3H7,2.24 -C4-Benzene,butyl benzene,C6H5C4H9,3.02 -C5-Benzene,pentyl benzene,C6H5C5H11,2.48 -C6-Benzene,hexyl benzene,C6H5C6H13,1.93 -C7-Benzene,heptyl benzene,C6H5C7H15,1.19 -C8-Benzene,octyl benzene,C6H5C8H17,0.89 -C9-Benzene,nonyl benzene,C6H5C9H19,1.00 -Diaromatic-C10,naphthalene,NAPH,0.12 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.42 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.63 -Cycloaromatic-C09,indane,INDANE,0.04 -Cycloaromatic-C10,tetralin,TETRA,0.43 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.13 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,1.63 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.45 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.12 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.23 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.56 -C09-Isoparaffin,2-methyl octane,C9H20-2,1.08 -C10-Isoparaffin,2-methyl nonane,C10H22-2,3.59 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.12 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.31 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,5.25 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.44 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,3.10 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.66 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.69 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.19 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.08 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.02 -n-C07,n-heptane,NC7H16,0.15 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1.14 -n-C10,n-decane,NC10H22,2.55 -n-C11,n-undecane,NC11H24,3.62 -n-C12,n-dodecane,NC12H26,3.70 -n-C13,n-tridecane,NC13H28,2.86 -n-C14,n-tetradecane,NC14H30,2.17 -n-C15,n-pentadecane,NC15H32,1.28 -n-C16,n-hexadecane (cetane),NC16H34,0.61 -n-C17,n-heptadecane,NC17H36,0.27 -n-C18,n-octadecane,NC18H38,0.07 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.20 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.69 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.67 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.26 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,4.11 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,4.07 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,3.65 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.43 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.55 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.64 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.37 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.02 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.29 -C10-Dicycloparaffin,Decalin,DECALIN,0.43 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.26 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.22 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.42 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.82 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.26 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.05 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/decane.csv b/fuelData/groupDecompositionData/decane.csv deleted file mode 100644 index b531635..0000000 --- a/fuelData/groupDecompositionData/decane.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -NC10H22,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/dodecane.csv b/fuelData/groupDecompositionData/dodecane.csv deleted file mode 100644 index aef9ba0..0000000 --- a/fuelData/groupDecompositionData/dodecane.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -NC12H26,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/hefa.csv b/fuelData/groupDecompositionData/hefa.csv deleted file mode 100644 index 53b4bfd..0000000 --- a/fuelData/groupDecompositionData/hefa.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin (lower put as same),3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/heptane-decane.csv b/fuelData/groupDecompositionData/heptane-decane.csv deleted file mode 100644 index cf6d35b..0000000 --- a/fuelData/groupDecompositionData/heptane-decane.csv +++ /dev/null @@ -1,3 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -NC7H16,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -NC10H22,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/heptane.csv b/fuelData/groupDecompositionData/heptane.csv deleted file mode 100644 index 12251cc..0000000 --- a/fuelData/groupDecompositionData/heptane.csv +++ /dev/null @@ -1,2 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -NC7H16,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/jet-a.csv b/fuelData/groupDecompositionData/jet-a.csv deleted file mode 100644 index b0216f6..0000000 --- a/fuelData/groupDecompositionData/jet-a.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/posf10264.csv b/fuelData/groupDecompositionData/posf10264.csv deleted file mode 100644 index b0216f6..0000000 --- a/fuelData/groupDecompositionData/posf10264.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/posf10289.csv b/fuelData/groupDecompositionData/posf10289.csv deleted file mode 100644 index b0216f6..0000000 --- a/fuelData/groupDecompositionData/posf10289.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/posf10325.csv b/fuelData/groupDecompositionData/posf10325.csv deleted file mode 100644 index b0216f6..0000000 --- a/fuelData/groupDecompositionData/posf10325.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/posf11498.csv b/fuelData/groupDecompositionData/posf11498.csv deleted file mode 100644 index c598988..0000000 --- a/fuelData/groupDecompositionData/posf11498.csv +++ /dev/null @@ -1,14 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C24-Isoparaffin,3,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Alkene,1,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Alkene,1,13,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/posf4658.csv b/fuelData/groupDecompositionData/posf4658.csv deleted file mode 100644 index b0216f6..0000000 --- a/fuelData/groupDecompositionData/posf4658.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/groupDecompositionData/refCompounds.csv b/fuelData/groupDecompositionData/refCompounds.csv deleted file mode 100755 index acbb91d..0000000 --- a/fuelData/groupDecompositionData/refCompounds.csv +++ /dev/null @@ -1,90 +0,0 @@ -Compound,CH3 (1),CH2 (2),CH (3),C (4),CH2=CH (1),CH=CH (2),CH2=C (2),CH=C (3),C=C (4),CH2=C=CH(1),ACH (2),AC (3),ACCH3 (2),ACCH2 (3),ACCH (4),OH (1),ACOH (2),CH3CO (1),CH2CO (2),CHO (1)*,CH3COO (1),CH2COO (2),HCOO (1),CH30 (1),CH20 (2),CH-O (3),FCH20 (1)*,CH2NH2 (1),CHNH2 (2),CH3NH (2),CH2NH (3),CHNH (4)*,CH3N (2),CH2N (3),ACNH2 (2),C5H4N (1),C5H3N (2),CH2CN (1)*,COOH (1),CH2C1 (1),CHC1 (2),CC1 (3),CHC12 (1)*,CC13 (1),CC12 (2),ACC1 (2),CH2N02 (1)*,CHN02 (2)*,ACN02 (2)*,CH2SH (1),C1(1)*,Br (1),CH≡C (1),C≡C (2)*,Cl—(C=C) (3)*,ACF (2),HCON(CH2)2 (2)*,CF3 (1),CF2 (2),CF (3),COO (2),CC12F (1),HCC1F (1),CC1F2 (1),FSpecial (1),CONH2 (1)*,CONHCH3 (1)*,CONHCH2 (1)*,CON(CH3)2 (1)*,CONCH2CH2 (3)*,CON(CH2)2 (3)*,C2H502 (1)*,C2H402 (2),CH3S (1),CH2S (2),CHS (3)*,C4H3S (1),C4H2S (2)*,Group j (CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CR=CRm—CRp=CRk m, p G (0,1), K n G (0,2)","CH3-CHm=CH, m G (0,1), n G (0,2)","CH2-CHm=CH, m G (0,1), n G (0,2)","CH—CUm=CUn or C—CHm=CH/ m G (0,1), n G (0,2)",Alicyclic side-chain CcyclicCm m > 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Benzene,1,8,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C14,1,2,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C15,1,5,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C21-Isoparaffin,3,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C22-Isoparaffin,3,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C23-Isoparaffin,3,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C24-Isoparaffin,3,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C19,2,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C20,2,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C21,2,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C22,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C23,2,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Monocycloparaffin,1,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Monocycloparaffin,1,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Dicycloparaffin,1,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Dicycloparaffin,1,13,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Tricycloparaffin,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Tricycloparaffin,0,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Alkene,1,7,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Alkene,1,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Alkene,1,11,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Alkene,1,13,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuelData/propertiesData/decane.csv b/fuelData/propertiesData/decane.csv deleted file mode 100644 index 2f9f9af..0000000 --- a/fuelData/propertiesData/decane.csv +++ /dev/null @@ -1,37 +0,0 @@ -Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,SurfaceTension,ThermalConductivity -C,g/cm^3,mm^2/s,kPa,Pa*s,N/m,W/m/K --29.65,0.76929,3.167726085,,0.0024369,0.0285, --23.15,,,,,0.0279, --19.65,0.76138,2.503349182,0.00393,0.001906,, --13.15,,,,,0.0269, --9.65,0.75352,2.038034823,0.00792,0.0015357,, --9.55,,,,,,0.1386 --3.15,,,,,0.026,0.1369 -0.35,0.7457,1.698404184,0.02,0.0012665,, -6.85,,,,,0.025,0.13421 -10.35,0.73791,1.442452332,0.0466,0.0010644,, -16.85,,,,,0.0241,0.13157 -20.35,0.73014,1.244487359,0.1014,0.00090865,, -26.85,,,,,0.0232,0.12896 -30.35,0.72237,1.088015837,0.2071,0.00078595,, -36.85,,,,,0.0223,0.12638 -40.35,0.71459,0.962062162,0.3998,0.00068748,, -46.85,,,,,0.0214,0.12383 -50.35,0.7068,0.85901245,0.734,0.00060715,, -56.85,,,,,0.0205,0.12132 -60.35,0.69898,0.77352714,1.288,0.00054068,, -66.85,,,,,0.0196,0.11884 -70.35,0.69112,0.701716055,2.17,0.00048497,, -76.85,,,,,0.0187,0.1164 -80.35,0.68321,0.640740036,3.524,0.00043776,, -86.85,,,,,0.0178,0.11399 -90,,,5.534,,, -96.85,,,,,0.0169,0.11163 -100,,,8.431,,, -106.85,,,,,0.0161,0.1093 -110,,,12.495,,, -116.85,,,,,0.0152,0.107 -120,,,18.06,,0.015, -126.85,,,,,,0.1048 -136.85,,,,,,0.1026 -140,,,,,,0.1019 \ No newline at end of file diff --git a/fuelData/propertiesData/dodecane.csv b/fuelData/propertiesData/dodecane.csv deleted file mode 100644 index cb98737..0000000 --- a/fuelData/propertiesData/dodecane.csv +++ /dev/null @@ -1,33 +0,0 @@ -Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,Cp,SurfaceTension,ThermalConductivity -C,g/cm^3,mm^2/s,kPa,Pa*s,J/mol/K,N/m,W/m/K --9.55,0.77153,3.754358223,0.000626,0.0028966,359.85,0.0279,0.14393 --3.15,,,,,,0.0274,0.14227 -0.45,0.76401,2.938704991,,0.0022452,364.29,, -6.85,,,0.00349,,,0.0265,0.13972 -10.45,0.75653,2.376244167,,0.0017977,369.15,, -16.85,,,,,,0.0256,0.13724 -20.45,0.7491,1.970497931,,0.0014761,374.36,, -26.85,,,0.0208,,,0.0248,0.13482 -30.45,0.7417,1.667520561,,0.0012368,379.87,0.0239,0.13245 -40.45,0.73431,1.43495254,,0.0010537,385.64,, -46.85,,,0.0947,,,0.023,0.13014 -50.45,0.72692,1.252187311,,0.00091024,391.64,, -56.85,,,,,,0.0221,0.12786 -60.45,0.71953,1.105680097,,0.00079557,397.82,, -66.85,,,0.346,,,0.0212,0.12562 -70.45,0.71212,0.986210189,,0.0007023,404.16,, -76.85,,,,,,0.0203,0.12343 -80.45,0.70468,0.887296361,,0.00062526,410.63,, -86.85,,,1.056,,,0.0194,0.12126 -90.45,0.69719,0.804285776,,0.00056074,417.21,, -96.85,,,,,,0.0185,0.11912 -100.45,0.68966,0.733723864,,0.00050602,423.89,, -106.85,,,2.783,,,0.0177,0.11701 -110.45,,,,,,, -116.85,,,,,,0.0168,0.11492 -120.45,,,,,,, -126.85,,,6.489,,,0.0159,0.11286 -130.45,,,,,,, -136.85,,,,,,0.0151,0.11081 -140,,,10.7,,,0.0148,0.11017 -140.45,,,,,,, \ No newline at end of file diff --git a/fuelData/propertiesData/hefa-jet-a-blends.csv b/fuelData/propertiesData/hefa-jet-a-blends.csv deleted file mode 100644 index fb759c6..0000000 --- a/fuelData/propertiesData/hefa-jet-a-blends.csv +++ /dev/null @@ -1,10 +0,0 @@ -HEFA_concentration,Viscosity_TALL,Viscosity_CAME,Viscosity_MFAT,Density_TALL,Density_CAME,Density_MFAT -wt percentage,mm2/s at -20 C,mm2/s at -20 C,mm2/s at -20 C,g/cm3 at 15 C,g/cm3 at 15 C,g/cm3 at 15 C -0,3.781578947,3.781578947,3.781578947,0.8057,0.8057,0.8057 -10,3.889473684,3.884210526,3.947368421,0.8009,0.8012,0.8007 -20,3.963157895,3.989473684,4.097368421,0.7961,0.7966,0.7966 -30,4.05,4.118421053,4.247368421,0.7904,0.7922,0.7924 -40,4.165789474,4.226315789,4.431578947,0.7861,0.7874,0.7877 -50,4.276315789,4.365789474,4.581578947,0.7814,0.7828,0.7834 -60,4.394736842,4.513157895,4.781578947,0.7769,0.7783,0.779 -100,4.973684211,5.2,5.618421053,0.7573,0.7598,0.7612 \ No newline at end of file diff --git a/fuelData/propertiesData/heptane.csv b/fuelData/propertiesData/heptane.csv deleted file mode 100644 index 45d575b..0000000 --- a/fuelData/propertiesData/heptane.csv +++ /dev/null @@ -1,39 +0,0 @@ -Temperature,Density,Viscosity,VaporPressure,DynamicViscosity,SurfaceTension,ThermalConductivity -C,g/cm^3,mm^2/s,kPa,Pa*s,N/m,W/m/K --60,0.75019,1.937642464,,0.0014536,, --50,0.74191,1.570136539,,0.0011649,, --40,0.73366,1.307472126,,0.00095924,, --30,0.72543,1.111933612,,0.00080663,, --20,0.71718,0.961571711,0.39,0.00068962,, --10,0.70892,0.842859561,0.644,0.00059752,, --9.55,,,,,0.0237,0.14005 --3.15,,,,,0.023,0.13843 -0,0.70062,0.747109703,1.25,0.00052344,, -6.85,,,,,0.022,0.13588 -10,0.69226,0.668491607,2.293,0.00046277,, -16.85,,,,,0.0209,0.13331 -20,0.68385,0.602895372,4,0.00041229,, -26.85,,,,,0.0198,0.13075 -30,0.67534,0.547457577,6.67,0.00036972,, -36.85,,,,,0.0188,0.1282 -40,0.66674,0.500044995,10.7,0.0003334,, -46.85,,,,,0.0178,0.12567 -50,0.65803,0.459082413,16.56,0.00030209,, -56.85,,,,,0.0167,0.12316 -60,0.64918,0.423349456,24.83,0.00027483,, -66.85,,,,,0.0157,0.12068 -70,,,36.18,,, -76.85,,,,,0.0148,0.11823 -80,,,51.37,,, -86.85,,,,,0.0138,0.11581 -90,,,71.28,,, -96.85,,,,,0.0128,0.11342 -100,,,96.84,,, -106.85,,,,,0.0119,0.11107 -110,,,129.1,,, -116.85,,,,,0.011,0.10873 -120,,,169.2,,, -126.85,,,,,0.01,0.10643 -130,,,,,, -136.85,,,,,0.00915,0.10414 -140,,,,,0.00888,0.10342 \ No newline at end of file diff --git a/fuelData/propertiesData/posf10264.csv b/fuelData/propertiesData/posf10264.csv deleted file mode 100644 index b8b99df..0000000 --- a/fuelData/propertiesData/posf10264.csv +++ /dev/null @@ -1,22 +0,0 @@ -Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity -C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K --40,0.822975,,6.6,,, --20,0.8086,,3.5,,, --10,,,,0.025842439,,2.018461485 -0,0.794225,0.04835033,,,0.129038462,2.047461358 -10,,,,,,2.07898547 -20,0.77985,0.628554285,,0.023836238,,2.11025023 -30,,,,,0.124038462,2.13774594 -40,0.765283333,1.402159558,1.14,0.022833667,0.12,2.18032366 -50,,,,,,2.21013612 -60,,3.432873401,,,0.116153846,2.24866239 -70,,,,,,2.28799548 -80,,7.397600428,,,,2.32905174 -90,,,,,,2.36824652 -100,,14.60179954,0.61,,,2.4095333 -110,,,,,,2.44825551 -120,,26.59268128,,,,2.48820526 -130,,,,,,2.52931339 -140,,,,,,2.56860038 -150,,,,,,2.60919559 -160,,,,,,2.66087899 \ No newline at end of file diff --git a/fuelData/propertiesData/posf10289.csv b/fuelData/propertiesData/posf10289.csv deleted file mode 100644 index 00f5515..0000000 --- a/fuelData/propertiesData/posf10289.csv +++ /dev/null @@ -1,24 +0,0 @@ -Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity -C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K --40,,,14.1,,, --20,,,6.5,,, --10,,,,0.02842143,,1.809232472 -0,0.838691667,0.04835033,,,,1.850945723 -10,,,,,,1.888953307 -20,0.823933333,0.338452307,,0.025727511,,1.920644544 -30,,,,,0.117980769,1.95028412 -40,0.80975,0.435152966,1.57,0.024724939,,1.988591385 -50,,,,,,2.017821782 -60,,1.305458899,,,,2.060491707 -70,,,,,,2.087007688 -75,,,,,0.108942308, -80,,3.336172742,,,,2.131216358 -90,,,,,,2.168711027 -100,,6.382243506,0.76,,,2.21016494 -110,,,,,,2.250350972 -120,,13.77984393,,,,2.288128033 -125,,,,,0.100865385, -130,,,,,,2.328342881 -140,,,,,,2.369145564 -150,,,,,,2.409671619 -160,,,,,,2.45891723 \ No newline at end of file diff --git a/fuelData/propertiesData/posf10325.csv b/fuelData/propertiesData/posf10325.csv deleted file mode 100644 index 8b40e31..0000000 --- a/fuelData/propertiesData/posf10325.csv +++ /dev/null @@ -1,22 +0,0 @@ -Temperature,Density,VaporPressure,Viscosity,SurfaceTension,ThermalConductivity,HeatCapacity -C,g/cm^3,kPa,mm^2/s,N/m,W/m/K,kJ/kg/K --40,0.843866667,,9.2,,, --20,0.829683333,,4.5,,, --10,,,,0.028028403,,1.88954449 -0,0.815116667,0.04835033,,,0.124230769,1.9302667 -10,,,,,,1.96006123 -20,0.8017,0.435152966,,0.024818739,0.120192308,1.98830303 -30,,,,,,2.02902524 -40,0.787325,0.821955603,1.31,0.023619632,0.116057692,2.06817277 -50,,,,,,2.11045502 -60,,2.272465491,,,0.112211538,2.14960987 -70,,,,,,2.19033207 -80,,4.931733619,,,,2.22012661 -90,,,,,,2.2514812 -100,,9.863467237,0.68,,,2.29063604 -120,,18.75992788,,,,2.32043789 -130,,,,,,2.3705204 -140,,,,,,2.41279534 -150,,,,,,2.4519575 -160,,,,,,2.49110503 -,,,,,,2.54118754 \ No newline at end of file diff --git a/fuelData/propertiesData/posf11498.csv b/fuelData/propertiesData/posf11498.csv deleted file mode 100755 index f492040..0000000 --- a/fuelData/propertiesData/posf11498.csv +++ /dev/null @@ -1,22 +0,0 @@ -Temperature,Density,VaporPressure,Viscosity -C,g/cm^3,kPa,mm^2/s --39.78658537,,,10.41126684 --20.15243902,,,4.996496178 -0,,0.029250391, -4.926624738,0.766266145,, -14.98951782,0.759216842,, -19.74128847,,0.10137713, -25.09146341,,,1.914179104 -25.26205451,0.751886646,, -35.11530398,0.744838516,, -39.69930983,,0.144264166, -40.0304878,,,1.535971059 -44.96855346,0.737790386,, -54.82180294,0.729903095,, -59.66534646,,0.36989935, -64.88469602,0.722294351,, -74.9475891,0.715245048,, -79.41849753,,0.741743738, -85.01048218,0.707356585,, -99.40473264,,1.427904253, -119.4195021,,2.764648172, \ No newline at end of file diff --git a/fuelData/refCompounds.csv b/fuelData/refCompounds.csv deleted file mode 100644 index 61e8d64..0000000 --- a/fuelData/refCompounds.csv +++ /dev/null @@ -1,90 +0,0 @@ -GCxGC Bin,Formula,Reference Compound,PelePhysics Key -Toluene,C7H8,toluene,C6H5CH3 -C2-Benzene,C8H10,ethyl benzene ,C6H5C2H5 -C3-Benzene,C9H12,propyl benzene,C6H5C3H7 -C4-Benzene,C10H14,butyl benzene,C6H5C4H9 -C5-Benzene,C11H16,pentyl benzene,C6H5C5H11 -C6-Benzene,C12H18,hexyl benzene,C6H5C6H13 -C7-Benzene,C13H20,heptyl benzene,C6H5C7H15 -C8-Benzene,C14H22,octyl benzene,C6H5C8H17 -C9-Benzene,C15H24,nonyl benzene,C6H5C9H19 -C10-Benzene,C16H26,decyl benzene,C6H5C10H21 -Diaromatic-C10,C10H8,naphthalene,NAPH -Diaromatic-C11,C11H10,1-methyl naphthalene,METHYLNAPH-1 -Diaromatic-C12,C12H12,1-ethyl naphthalene,ETHYLNAPH-1 -Diaromatic-C13,C13H14,1-propyl naphthalene,PROPYLNAPH-1 -Diaromatic-C14,C14H16,1-butyl naphthalene,BUTYLNAPH-1 -Cycloaromatic-C09,C9H10,indane,INDANE -Cycloaromatic-C10,C10H12,tetralin,TETRA -Cycloaromatic-C11,C11H14,2-methyl tetralin,METHYLTETRA-2 -Cycloaromatic-C12,C12H16,2-ethly tetralin,ETHYLTETRA-2 -Cycloaromatic-C13,C13H18,2-propyl tetralin,PROPYLTETRA-2 -Cycloaromatic-C14,C14H20,2-butyl tetralin,BUTYLTETRA-2 -Cycloaromatic-C15,C15H22,2-pentyl tetralin,PENTYLTETRA-2 -C07-Isoparaffin,C7H16,2-methyl hexane,C7H16-2 -C08-Isoparaffin,C8H18,2-methyl heptane,C8H18-2 -C09-Isoparaffin,C9H20,2-methyl octane,C9H20-2 -C10-Isoparaffin,C10H22,2-methyl nonane,C10H22-2 -C11-Isoparaffin,C11H24,2-methyl decane,C11H24-2 -C12-Isoparaffin,C12H26,2-methyl undecane,C12H26-2 -C13-Isoparaffin,C13H28,2-methyl dodecane,C13H28-2 -C14-Isoparaffin,C14H30,2-methyl tridecane,C14H30-2 -C15-Isoparaffin,C15H32,2-methyl tetradecane,C15H32-2 -C16-Isoparaffin,C16H34,2-methyl pentadecane,C16H34-2 -C17-Isoparaffin,C17H36,2-methyl hexadecane,C17H36-2 -C18-Isoparaffin,C18H38,2-methyl heptadecane,C18H38-2 -C19-Isoparaffin,C19H40,2-methyl octadecane,C19H40-2 -C20-Isoparaffin,C20H42,2-methyl nonadecane,C20H42-2 -C21-Isoparaffin,C21H44,2-methyl icosane,C21H44-2 -C22-Isoparaffin,C22H46,2-methyl henicosane,C22H46-2 -C23-Isoparaffin,C23H48,2-methyl docosane,C23H48-2 -C24-Isoparaffin,C24H50,2-methyl tricosane,C24H50-2 -n-C07,C7H16,n-heptane,NC7H16 -n-C08,C8H18,n-octane,NC8H18 -n-C09,C9H20,n-nonane,NC9H20 -n-C10,C10H22,n-decane,NC10H22 -n-C11,C11H24,n-undecane,NC11H24 -n-C12,C12H26,n-dodecane,NC12H26 -n-C13,C13H28,n-tridecane,NC13H28 -n-C14,C14H30,n-tetradecane,NC14H30 -n-C15,C15H32,n-pentadecane,NC15H32 -n-C16,C16H34,n-hexadecane,NC16H34 -n-C17,C17H36,n-heptadecane,NC17H36 -n-C18,C18H38,n-octadecane,NC18H38 -n-C19,C19H40,n-nonadecane,NC19H40 -n-C20,C20H42,n-icosane,NC20H42 -n-C21,C21H44,n-henicosane,NC21H44 -n-C22,C22H46,n-docosane,NC22H46 -n-C23,C23H48,n-tricosane,NC23H48 -C07-Monocycloparaffin,C7C14,methyl cyclohexane,C6H11CH3 -C08-Monocycloparaffin,C8H16,ethyl cyclohexane,C6H11C2H5 -C09-Monocycloparaffin,C9H18,propyl cyclohexane,C6H11C3H7 -C10-Monocycloparaffin,C10H20,butyl cyclohexane,C6H11C4H9 -C11-Monocycloparaffin,C11H22,pentyl cyclohexane,C6H11C5H11 -C12-Monocycloparaffin,C12H24,hexyl cyclohexane,C6H11C6H13 -C13-Monocycloparaffin,C13H26,heptyl cyclohexane,C6H11C7H15 -C14-Monocycloparaffin,C14H28,octyl cyclohexane,C6H11C8H17 -C15-Monocycloparaffin,C15H30,nonyl cyclohexane,C6H11C9H19 -C16-Monocycloparaffin,C16H32,decyl cyclohexane,C6H11C10H21 -C17-Monocycloparaffin,C17H34,undecyl cyclohexane,C6H11C11H23 -C18-Monocycloparaffin,C18H36,dodecyl cyclohexane,C6H11C12H25 -C19-Monocycloparaffin,C19H38,tridecyl cyclohexane,C6H11C13H27 -C08-Dicycloparaffin,C8H14,Octahydropentalene,OHPEN -C09-Dicycloparaffin,C9H16,Hydrindane,HYDRIND -C10-Dicycloparaffin,C10H18,Decalin,DECALIN -C11-Dicycloparaffin,C11H20,2-methyldecalin,METHYLDECALIN-2 -C12-Dicycloparaffin,C12H22,2-ethyldecalin,ETHYLDECALIN-2 -C13-Dicycloparaffin,C13H24,2-propyldecalin,PROPYLDECALIN-2 -C14-Dicycloparaffin,C14H26,2-butyldecalin,BUTYLDECALIN-2 -C15-Dicycloparaffin,C15H28,2-pentyldecalin,PENTYLDECALIN-2 -C16-Dicycloparaffin,C16H30,2-hexyldecalin,HEXYLDECALIN-2 -C17-Dicycloparaffin,C17H32,2-heptyldecalin,HEPTYLDECALIN-2 -C10-Tricycloparaffin,C10H16,C1CC2C(C1)C1CCCC21,TRICYCLO-C10 -C11-Tricycloparaffin,C11H18,C1CC2CC3CCCC3C2C1,TRICYCLO-C11 -C12-Tricycloparaffin,C12H20,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12 -C13-Tricycloparaffin,C13H22,C1CCC2C(C1)CC1CCCCC12,TRICYCLO-C13 -C14-Tricycloparaffin,C13H22,C1CCC2CC3CCCCC3CC2C1,TRICYCLO-C14 -C10-Alkene,C10H20,1-decene,DECENE-1 -C12-Alkene,C12H24,1-dodecene,DODECENE-1 -C14-Alkene,C14H28,1-tetradecene,TETRADECENE-1 -C16-Alkene,C16H32,1-hexadecene,HEXADECENE-1 \ No newline at end of file diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 4949208..fb16ca6 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -23,6 +23,7 @@ get_fueldata_gc_dir, get_fueldata_decomp_dir, get_fueldata_props_dir, + get_decomp_name_from_metadata, ) # Physical constants @@ -73,7 +74,8 @@ def __init__(self, name, decompName=None, fuelDataDir=None): self.name = name if decompName is None: - decompName = name + # Try to get decomposition name from metadata + decompName = get_decomp_name_from_metadata(name, fuelDataDir) # Determine which data directories to use if fuelDataDir is None: @@ -108,28 +110,81 @@ def __init__(self, name, decompName=None, fuelDataDir=None): # 2: cycloparaffins # 3: olefins self.fam = np.zeros(self.num_compounds, dtype=int) + + # Classify hydrocarbon by type (n-alkane, iso-alkane, cyclo-alkane, aromatic) + # Based on group decompositions from Constantinou-Gani method + self.hc_type = np.array([''] * self.num_compounds, dtype=object) + aromatics = 10 # starting index for aromatic groups num_aromatics = 5 - cyclos = 84 # starting index for membered ring groups + branching = 78 # starting index for branching groups (Group j (CH3)2CH through C(CH3)2C(CH3)2) + num_branching = 5 # groups 78-82 inclusive + cyclos = 83 # starting index for membered ring groups (3-7 membered rings) num_cyclos = 5 olefins = 4 # starting index for double bound groups num_olefins = 6 + for i in range(self.num_compounds): # Check if aromatic: does it contain AC's? if sum(self.Nij[i, aromatics : aromatics + num_aromatics]) > 0: self.fam[i] = 1 + self.hc_type[i] = 'aromatic' # Check if cycloparaffin: does it contain rings? elif sum(self.Nij[i, cyclos : cyclos + num_cyclos]) > 0: self.fam[i] = 2 + self.hc_type[i] = 'cyclo-alkane' # Check if olefin: does it contain double bonds? elif sum(self.Nij[i, olefins : olefins + num_olefins]) > 0: self.fam[i] = 3 - - # Read initial liquid composition of mixture and normalize to get mass frac + self.hc_type[i] = 'alkene' + # Check for branching groups (CH, C quaternary carbons) + elif sum(self.Nij[i, branching : branching + num_branching]) > 0: + self.hc_type[i] = 'iso-alkane' + else: + # Only CH3 and CH2 -> n-alkane (linear) + self.hc_type[i] = 'n-alkane' + + # Calculate carbon and hydrogen numbers from first-order group decomposition + # For jet fuels, use only alkyl (0-3) and aromatic (10-14) groups + # Alkyl: CH3=1C,3H; CH2=1C,2H; CH=1C,1H; C=1C,0H + # Aromatic: ACH=1C,1H; AC=1C,0H; ACCH3=2C,3H; ACCH2=2C,2H; ACCH=2C,1H + alkyl_carbons = np.array([1, 1, 1, 1]) # groups 0-3 + alkyl_hydrogens = np.array([3, 2, 1, 0]) + # Olefinic: group 4 appears to represent 2 carbons with 3 hydrogens in UNIFAC-based system + olefinic_carbons = np.array([2, 1, 1, 0, 0, 0]) # groups 4-9 + olefinic_hydrogens = np.array([3, 1, 0, 0, 0, 0]) + aromatic_carbons = np.array([1, 1, 2, 2, 2]) # groups 10-14 + aromatic_hydrogens = np.array([1, 0, 3, 2, 1]) + + self.nC = np.zeros(self.num_compounds, dtype=float) + self.nH = np.zeros(self.num_compounds, dtype=float) + for i in range(self.num_compounds): + # Alkyl contribution (groups 0-3) + self.nC[i] = np.dot(self.Nij[i, 0:4], alkyl_carbons) + self.nH[i] = np.dot(self.Nij[i, 0:4], alkyl_hydrogens) + # Olefinic contribution (groups 4-9) + self.nC[i] += np.dot(self.Nij[i, 4:10], olefinic_carbons) + self.nH[i] += np.dot(self.Nij[i, 4:10], olefinic_hydrogens) + # Aromatic contribution (groups 10-14) + self.nC[i] += np.dot(self.Nij[i, 10:15], aromatic_carbons) + self.nH[i] += np.dot(self.Nij[i, 10:15], aromatic_hydrogens) + + # Read GCxGC/compound data df_gcxgc = pd.read_csv(self.gcxgcFile) + self.compounds = [ compound.strip() for compound in df_gcxgc["Compound"].to_list() ] + + # Load molecular formulas if available + if "Formula" in df_gcxgc.columns: + self.formulas = [ + formula.strip() if pd.notna(formula) else None + for formula in df_gcxgc["Formula"].to_list() + ] + else: + self.formulas = None + if "PelePhysics Key" in df_gcxgc.columns: self.pelephysics_keys = [ key.strip() for key in df_gcxgc["PelePhysics Key"].to_list() diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index 17613ce..13b5eef 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -13,6 +13,12 @@ else: from importlib_resources import files +try: + import yaml + HAS_YAML = True +except ImportError: + HAS_YAML = False + def get_data_dir(): """ @@ -74,3 +80,91 @@ def get_fueldata_props_dir(): :rtype: str """ return os.path.join(get_fueldata_dir(), "propertiesData") + + +def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): + """ + Load decomposition name mapping from fuel_metadata.yaml. + + :param fuel_name: Name of the fuel to look up. + :type fuel_name: str + :param fuel_data_dir: Directory containing fuel data. If None, uses embedded data. + :type fuel_data_dir: str, optional + :return: Decomposition name from metadata. + :rtype: str + :raises FileNotFoundError: If fuel_metadata.yaml is missing or fuel not found in metadata + """ + if not HAS_YAML: + raise ImportError( + "PyYAML is required to use custom fuels. Install it with: pip install pyyaml" + ) + + if fuel_data_dir is None: + # Use embedded data + metadata_file = os.path.join( + get_fueldata_dir(), + "fuel_metadata.yaml" + ) + data_dir_display = "FuelLib embedded data" + else: + # Use custom data directory + metadata_file = os.path.join( + fuel_data_dir, + "fuel_metadata.yaml" + ) + data_dir_display = fuel_data_dir + + if not os.path.exists(metadata_file): + raise FileNotFoundError( + f"fuel_metadata.yaml not found in {data_dir_display}.\n\n" + f"This file is required for all fuels. Please create:\n" + f" {metadata_file}\n\n" + f"Minimal example:\n" + f" fuels:\n" + f" {fuel_name}:\n" + f" decomp_name: {fuel_name} # or name of your .csv file in groupDecompositionData/\n\n" + f"See the 'Adding Custom Fuels' documentation for more details." + ) + + try: + with open(metadata_file, 'r') as f: + data = yaml.safe_load(f) + except Exception as e: + raise ValueError( + f"Error parsing {metadata_file}:\n{e}\n\n" + f"Make sure the file is valid YAML with proper indentation." + ) + + if not data or 'fuels' not in data: + raise ValueError( + f"Invalid metadata file {metadata_file}.\n" + f"File must contain a 'fuels' section.\n\n" + f"Example:\n" + f" fuels:\n" + f" {fuel_name}:\n" + f" decomp_name: {fuel_name}" + ) + + if fuel_name not in data['fuels']: + available = list(data['fuels'].keys()) + raise KeyError( + f"Fuel '{fuel_name}' not found in {metadata_file}.\n\n" + f"Available fuels: {', '.join(available) if available else 'none'}\n\n" + f"Add an entry for '{fuel_name}':\n" + f" fuels:\n" + f" {fuel_name}:\n" + f" decomp_name: {fuel_name}" + ) + + fuel_meta = data['fuels'][fuel_name] + + if 'decomp_name' not in fuel_meta: + raise ValueError( + f"Incomplete metadata for fuel '{fuel_name}' in {metadata_file}.\n\n" + f"Required fields:\n" + f" - decomp_name: Name of the .csv file in groupDecompositionData/ (without .csv extension)\n\n" + f"Current entry:\n" + f" {fuel_name}: {fuel_meta}" + ) + + return fuel_meta['decomp_name'] diff --git a/fuellib/data/fuelData/fuel_metadata.yaml b/fuellib/data/fuelData/fuel_metadata.yaml new file mode 100644 index 0000000..acf77f8 --- /dev/null +++ b/fuellib/data/fuelData/fuel_metadata.yaml @@ -0,0 +1,115 @@ +# Fuel Library Metadata +# Contains source information and properties for fuels in FuelLib + +fuels: + # POSF Fuels (Petroleum Surrogate Fuels) + posf4658: + name: POSF4658 + category: Conventional + source: Edwards et al. (2017) + reference: https://doi.org/10.2514/6.2017-0146 + description: 2004 physical average jet fuel constructed by blending 5 separate jet fuels from across the U.S. + decomp_name: posf4658 + + posf10264: + name: A-1 POSF10264 JP-8 + category: Conventional + source: Edwards et al. (2020) + reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf + description: Best case fuel from NJFCP. Low viscosity, low density, and a low flash point. + decomp_name: posf10264 + + posf10289: + name: A-3 POSF10289 JP-5 + category: Conventional + source: Edwards et al. (2020) + reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf + description: Worst case fuel from NJFCP. High viscosity, high density, and a high flash point. + decomp_name: posf10289 + + posf10325: + name: A-2 POSF10325 Jet A + category: Conventional + source: Edwards et al. (2020) + reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf + description: Baseline fuel from NJFCP. Average density, average viscosity, and average flash point. + decomp_name: posf10325 + + posf11498: + name: C-1 POSF11498 ATJ + category: SATF + source: Edwards et al. (2020) + reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf + description: Atypical alternative fuel from NJFCP. Isoparaffinic-only with low density, average viscosity, and a flat distillation curve. + decomp_name: posf11498 + + # HEFA Fuels (Hydroprocessed Esters and Fatty Acids) + hefa-came: + name: HEFA-CAME + category: SATF + source: Vozka et al. (2018) + reference: https://doi.org/10.1021/acs.energyfuels.8b02787 + description: HEFA-SPK from camelina oil feedstock + decomp_name: hefa + + hefa-mfat: + name: HEFA-MFAT + category: SATF + source: Vozka et al. (2018) + reference: https://doi.org/10.1021/acs.energyfuels.8b02787 + description: HEFA from mixed fat feedstock + decomp_name: hefa + + hefa-tall: + name: HEFA-TALL + category: SATF + source: Vozka et al. (2018) + reference: https://doi.org/10.1021/acs.energyfuels.8b02787 + description: HEFA from tallow feedstock + decomp_name: hefa + + # Jet-A (Conventional Jet Fuel) + jet-a: + name: Jet-A + category: Conventional + source: Vozka et al. (2018) + reference: https://doi.org/10.1021/acs.energyfuels.8b02787 + description: Conventional Jet-A + decomp_name: jet-A + + # Single Component Reference Fuels + decane: + name: n-Decane + category: Simple + source: NIST + reference: null + description: 100% n-decane + decomp_name: decane + props_data: decane + + dodecane: + name: n-Dodecane + category: Simple + source: NIST + reference: null + description: 100% n-dodecane + decomp_name: dodecane + props_data: dodecane + + heptane: + name: n-Heptane + category: Simple + source: NIST + reference: null + description: 100% n-heptane + decomp_name: heptane + props_data: heptane + + heptane-decane: + name: n-Heptane/n-Decane Blend + category: Simple + source: null + reference: null + description: 50/50 (mass) blend of n-heptane and n-decane + decomp_name: heptane-decane + props_data: null \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/decane_init.csv b/fuellib/data/fuelData/gcData/decane_init.csv index b0d0709..ce09864 100644 --- a/fuellib/data/fuelData/gcData/decane_init.csv +++ b/fuellib/data/fuelData/gcData/decane_init.csv @@ -1,2 +1,2 @@ -Compound,Weight % -NC10H22,100 \ No newline at end of file +Compound,Formula,Weight % +NC10H22,,100 diff --git a/fuellib/data/fuelData/gcData/dodecane_init.csv b/fuellib/data/fuelData/gcData/dodecane_init.csv index a9a068e..9b7d3fc 100644 --- a/fuellib/data/fuelData/gcData/dodecane_init.csv +++ b/fuellib/data/fuelData/gcData/dodecane_init.csv @@ -1,2 +1,2 @@ -Compound,Weight % -NC12H26,100 \ No newline at end of file +Compound,Formula,Weight % +NC12H26,,100 diff --git a/fuellib/data/fuelData/gcData/hefa-S1_init.csv b/fuellib/data/fuelData/gcData/hefa-S1_init.csv deleted file mode 100644 index ecb828e..0000000 --- a/fuellib/data/fuelData/gcData/hefa-S1_init.csv +++ /dev/null @@ -1,3 +0,0 @@ -Compound,Weight % -2-methylnonane,59.57069121 -n-undecane,40.42930879 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv b/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv deleted file mode 100644 index 63fda34..0000000 --- a/fuellib/data/fuelData/gcData/hefa-WE-SAF-262714_init.csv +++ /dev/null @@ -1,33 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -C2-Benzene,ethyl benzene ,C2-BENZ,0.057556412 -C3-Benzene,propyl benzene,C3-BENZ,0.087931343 -C4-Benzene,butyl benzene,C4-BENZ,0.055032501 -C5-Benzene,pentyl benzene,C5-BENZ,0.026794203 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.199891503 -C08-Isoparaffin,2-methyl heptane,C8H18-2,2.370108437 -C09-Isoparaffin,2-methyl octane,C9H20-2,12.77270292 -C10-Isoparaffin,2-methyl nonane,C10H22-2,13.57486711 -C11-Isoparaffin,2-methyl decane,C11H24-2,12.23020367 -C12-Isoparaffin,2-methyl undecane,C12H26-2,9.826870781 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,7.725886046 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,5.514863988 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,6.842162663 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,3.510088296 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.133370244 -n-C07,n-heptane,NC7H16,0.148235261 -n-C08,n-octane,NC8H18,1.487407628 -n-C09,n-nonane,NC9H20,2.972384727 -n-C10,n-decane,NC10H22,2.700025728 -n-C11,n-undecane,NC11H24,2.274630182 -n-C12,n-dodecane,NC12H26,1.769651957 -n-C13,n-tridecane,NC13H28,2.68987968 -n-C14,n-tetradecane,NC14H30,3.014507942 -n-C15,n-pentadecane,NC15H32,2.491315435 -n-C16,n-hexadecane (cetane),NC16H34,0.960304858 -C05-Monocycloparaffin,cycopentane,C5-CYCLO,0.940382227 -C07-Monocycloparaffin,methyl cyclohexane,C7-CYCLO,0.075019973 -C08-Monocycloparaffin,ethyl cyclohexane,C8-CYCLO,0.382113294 -C09-Monocycloparaffin,propyl cyclohexane,C9-CYCLO,1.884099028 -C10-Monocycloparaffin,butyl cyclohexane,C10-CYCLO,0.844267369 -C11-Monocycloparaffin,pentyl cyclohexane,C11-CYCLO,0.327108201 -C12-Monocycloparaffin,hexyl cyclohexane,C12-CYCLO,0.110336399 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/hefa-came_init.csv b/fuellib/data/fuelData/gcData/hefa-came_init.csv index 527882a..431a1a0 100644 --- a/fuellib/data/fuelData/gcData/hefa-came_init.csv +++ b/fuellib/data/fuelData/gcData/hefa-came_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0 -C2-Benzene,ethyl benzene ,C6H5C2H5,0.01 -C3-Benzene,propyl benzene,C6H5C3H7,0.02 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0 -C08-Isoparaffin,2-methyl heptane,C8H18-2,1.51 -C09-Isoparaffin,2-methyl octane,C9H20-2,11.09 -C10-Isoparaffin,2-methyl nonane,C10H22-2,11.1 -C11-Isoparaffin,2-methyl decane,C11H24-2,9.62 -C12-Isoparaffin,2-methyl undecane,C12H26-2,8.27 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,8.33 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,6.39 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,5.42 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,2.14 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,21.58 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,4.71 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.83 -n-C09,n-nonane,NC9H20,1.92 -n-C10,n-decane,NC10H22,1.4 -n-C11,n-undecane,NC11H24,0.84 -n-C12,n-dodecane,NC12H26,0.59 -n-C13,n-tridecane,NC13H28,0.49 -n-C14,n-tetradecane,NC14H30,0.23 -n-C15,n-pentadecane,NC15H32,0.46 -n-C16,n-hexadecane (cetane),NC16H34,0.2 -n-C17,n-heptadecane,NC17H36,0.12 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.1 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.94 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.52 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.15 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.04 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.01 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.0 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,0.01 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,0.02 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,0.0 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,0.0 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,0.0 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.0 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.0 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.0 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.0 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.0 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.0 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.0 +Cycloaromatic-C09,indane,C9H10,INDANE,0.0 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.0 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,0.0 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,0.0 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,0.0 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.0 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.0 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,1.51 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,11.09 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,11.1 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,9.62 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,8.27 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,8.33 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,6.39 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,5.42 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,2.14 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,21.58 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,4.71 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.0 +n-C08,n-octane,C8H18,NC8H18,0.83 +n-C09,n-nonane,C9H20,NC9H20,1.92 +n-C10,n-decane,C10H22,NC10H22,1.4 +n-C11,n-undecane,C11H24,NC11H24,0.84 +n-C12,n-dodecane,C12H26,NC12H26,0.59 +n-C13,n-tridecane,C13H28,NC13H28,0.49 +n-C14,n-tetradecane,C14H30,NC14H30,0.23 +n-C15,n-pentadecane,C15H32,NC15H32,0.46 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.2 +n-C17,n-heptadecane,C17H36,NC17H36,0.12 +n-C18,n-octadecane,C18H38,NC18H38,0.0 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.1 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,1.94 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,0.52 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,0.15 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,0.04 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,0.0 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,0.0 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,0.0 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,0.0 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.0 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.0 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.0 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.01 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.0 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,0.0 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,0.0 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,0.0 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.0 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/hefa-mfat_init.csv b/fuellib/data/fuelData/gcData/hefa-mfat_init.csv index 2c196c9..23a8ff6 100644 --- a/fuellib/data/fuelData/gcData/hefa-mfat_init.csv +++ b/fuellib/data/fuelData/gcData/hefa-mfat_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.01 -C2-Benzene,ethyl benzene ,C6H5C2H5,0 -C3-Benzene,propyl benzene,C6H5C3H7,0.01 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 -C08-Isoparaffin,2-methyl heptane,C8H18-2,1.77 -C09-Isoparaffin,2-methyl octane,C9H20-2,3.65 -C10-Isoparaffin,2-methyl nonane,C10H22-2,6.69 -C11-Isoparaffin,2-methyl decane,C11H24-2,10.33 -C12-Isoparaffin,2-methyl undecane,C12H26-2,12.37 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,11.54 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,13.98 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,4.29 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,20.73 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.29 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,3.44 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1 -n-C10,n-decane,NC10H22,1.42 -n-C11,n-undecane,NC11H24,1.36 -n-C12,n-dodecane,NC12H26,1.44 -n-C13,n-tridecane,NC13H28,0.87 -n-C14,n-tetradecane,NC14H30,1.67 -n-C15,n-pentadecane,NC15H32,0.18 -n-C16,n-hexadecane (cetane),NC16H34,0.7 -n-C17,n-heptadecane,NC17H36,0.01 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.07 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.76 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.41 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.27 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.14 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0.02 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0.01 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.01 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,0.0 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,0.01 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,0.0 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,0.0 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,0.0 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.0 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.0 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.0 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.0 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.0 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.0 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.0 +Cycloaromatic-C09,indane,C9H10,INDANE,0.0 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.0 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,0.0 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,0.0 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,0.0 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.0 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.01 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,1.77 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,3.65 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,6.69 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,10.33 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,12.37 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,11.54 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,13.98 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,4.29 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,20.73 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.29 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,3.44 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.0 +n-C08,n-octane,C8H18,NC8H18,0.54 +n-C09,n-nonane,C9H20,NC9H20,1.0 +n-C10,n-decane,C10H22,NC10H22,1.42 +n-C11,n-undecane,C11H24,NC11H24,1.36 +n-C12,n-dodecane,C12H26,NC12H26,1.44 +n-C13,n-tridecane,C13H28,NC13H28,0.87 +n-C14,n-tetradecane,C14H30,NC14H30,1.67 +n-C15,n-pentadecane,C15H32,NC15H32,0.18 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.7 +n-C17,n-heptadecane,C17H36,NC17H36,0.01 +n-C18,n-octadecane,C18H38,NC18H38,0.0 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.07 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,0.76 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,0.41 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,0.27 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,0.14 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,0.02 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,0.01 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,0.0 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,0.0 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.0 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.0 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.0 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.0 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.0 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,0.0 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,0.0 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,0.0 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.0 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/hefa-tall_init.csv b/fuellib/data/fuelData/gcData/hefa-tall_init.csv index 75bebde..54ba687 100644 --- a/fuellib/data/fuelData/gcData/hefa-tall_init.csv +++ b/fuellib/data/fuelData/gcData/hefa-tall_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0 -C2-Benzene,ethyl benzene ,C6H5C2H5,0 -C3-Benzene,propyl benzene,C6H5C3H7,0 -C4-Benzene,butyl benzene,C6H5C4H9,0 -C5-Benzene,pentyl benzene,C6H5C5H11,0 -C6-Benzene,hexyl benzene,C6H5C6H13,0 -C7-Benzene,heptyl benzene,C6H5C7H15,0 -C8-Benzene,octyl benzene,C6H5C8H17,0 -C9-Benzene,nonyl benzene,C6H5C9H19,0 -Diaromatic-C10,naphthalene,NAPH,0 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0 -Cycloaromatic-C09,indane,INDANE,0 -Cycloaromatic-C10,tetralin,TETRA,0 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.06 -C09-Isoparaffin,2-methyl octane,C9H20-2,6.13 -C10-Isoparaffin,2-methyl nonane,C10H22-2,12.14 -C11-Isoparaffin,2-methyl decane,C11H24-2,12.6 -C12-Isoparaffin,2-methyl undecane,C12H26-2,13.52 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,12.69 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,8.75 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,21.74 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,4.13 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.1 -n-C09,n-nonane,NC9H20,1.84 -n-C10,n-decane,NC10H22,1.69 -n-C11,n-undecane,NC11H24,1.33 -n-C12,n-dodecane,NC12H26,1.12 -n-C13,n-tridecane,NC13H28,0.86 -n-C14,n-tetradecane,NC14H30,0.56 -n-C15,n-pentadecane,NC15H32,0.32 -n-C16,n-hexadecane (cetane),NC16H34,0 -n-C17,n-heptadecane,NC17H36,0 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.22 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,0.18 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,0.02 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,0.01 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,0 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,0 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0 -C10-Dicycloparaffin,Decalin,DECALIN,0 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.0 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,0.0 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,0.0 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,0.0 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,0.0 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,0.0 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.0 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.0 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.0 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.0 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.0 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.0 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.0 +Cycloaromatic-C09,indane,C9H10,INDANE,0.0 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.0 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,0.0 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,0.0 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,0.0 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.0 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.0 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.06 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,6.13 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,12.14 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,12.6 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,13.52 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,12.69 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,8.75 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,21.74 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,4.13 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.0 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.0 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.0 +n-C08,n-octane,C8H18,NC8H18,0.1 +n-C09,n-nonane,C9H20,NC9H20,1.84 +n-C10,n-decane,C10H22,NC10H22,1.69 +n-C11,n-undecane,C11H24,NC11H24,1.33 +n-C12,n-dodecane,C12H26,NC12H26,1.12 +n-C13,n-tridecane,C13H28,NC13H28,0.86 +n-C14,n-tetradecane,C14H30,NC14H30,0.56 +n-C15,n-pentadecane,C15H32,NC15H32,0.32 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.0 +n-C17,n-heptadecane,C17H36,NC17H36,0.0 +n-C18,n-octadecane,C18H38,NC18H38,0.0 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.0 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,0.22 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,0.18 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,0.02 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,0.01 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,0.0 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,0.0 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,0.0 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,0.0 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.0 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.0 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.0 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.0 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.0 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,0.0 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,0.0 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,0.0 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.0 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/heptane-decane_init.csv b/fuellib/data/fuelData/gcData/heptane-decane_init.csv index 70680b1..7c50f91 100644 --- a/fuellib/data/fuelData/gcData/heptane-decane_init.csv +++ b/fuellib/data/fuelData/gcData/heptane-decane_init.csv @@ -1,3 +1,3 @@ -Compound,Weight % -NC7H16,73.75 -NC10H22,26.25 \ No newline at end of file +Compound,Formula,Weight % +NC7H16,,73.75 +NC10H22,,26.25 diff --git a/fuellib/data/fuelData/gcData/heptane_init.csv b/fuellib/data/fuelData/gcData/heptane_init.csv index d57c668..c4ed359 100644 --- a/fuellib/data/fuelData/gcData/heptane_init.csv +++ b/fuellib/data/fuelData/gcData/heptane_init.csv @@ -1,2 +1,2 @@ -Compound,Weight % -NC7H16,100 \ No newline at end of file +Compound,Formula,Weight % +NC7H16,,100 diff --git a/fuellib/data/fuelData/gcData/jet-a_init.csv b/fuellib/data/fuelData/gcData/jet-a_init.csv index 07d4e30..a1f129f 100644 --- a/fuellib/data/fuelData/gcData/jet-a_init.csv +++ b/fuellib/data/fuelData/gcData/jet-a_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.07 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.79 -C3-Benzene,propyl benzene,C6H5C3H7,4.54 -C4-Benzene,butyl benzene,C6H5C4H9,3.27 -C5-Benzene,pentyl benzene,C6H5C5H11,2.73 -C6-Benzene,hexyl benzene,C6H5C6H13,1.76 -C7-Benzene,heptyl benzene,C6H5C7H15,0.98 -C8-Benzene,octyl benzene,C6H5C8H17,0.47 -C9-Benzene,nonyl benzene,C6H5C9H19,0.15 -Diaromatic-C10,naphthalene,NAPH,0.11 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.44 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.63 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.51 -Cycloaromatic-C09,indane,INDANE,0.14 -Cycloaromatic-C10,tetralin,TETRA,0.45 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,2.43 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.21 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.46 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.42 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.01 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.31 -C09-Isoparaffin,2-methyl octane,C9H20-2,4.12 -C10-Isoparaffin,2-methyl nonane,C10H22-2,6.63 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.02 -C12-Isoparaffin,2-methyl undecane,C12H26-2,3.21 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,2.95 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,2.39 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,1.66 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.87 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.19 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.08 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0 -n-C08,n-octane,NC8H18,0.67 -n-C09,n-nonane,NC9H20,4.42 -n-C10,n-decane,NC10H22,4.73 -n-C11,n-undecane,NC11H24,3.44 -n-C12,n-dodecane,NC12H26,2.49 -n-C13,n-tridecane,NC13H28,1.93 -n-C14,n-tetradecane,NC14H30,1.31 -n-C15,n-pentadecane,NC15H32,0.79 -n-C16,n-hexadecane (cetane),NC16H34,0.38 -n-C17,n-heptadecane,NC17H36,0.09 -n-C18,n-octadecane,NC18H38,0.02 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.19 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,5.81 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,5.26 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.58 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,2.82 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.5 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,1.53 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,0.65 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.02 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.86 -C09-Dicycloparaffin,Hydrindane,HYDRIND,1.21 -C10-Dicycloparaffin,Decalin,DECALIN,1.05 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.8 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.27 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.09 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.07 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,1.79 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,4.54 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,3.27 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,2.73 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,1.76 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.98 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.47 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.15 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.11 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.44 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.63 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.51 +Cycloaromatic-C09,indane,C9H10,INDANE,0.14 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.45 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,2.43 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,2.21 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,1.46 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.42 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.01 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.31 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,4.12 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,6.63 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,5.02 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,3.21 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,2.95 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,2.39 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,1.66 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,0.87 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.19 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.08 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.0 +n-C08,n-octane,C8H18,NC8H18,0.67 +n-C09,n-nonane,C9H20,NC9H20,4.42 +n-C10,n-decane,C10H22,NC10H22,4.73 +n-C11,n-undecane,C11H24,NC11H24,3.44 +n-C12,n-dodecane,C12H26,NC12H26,2.49 +n-C13,n-tridecane,C13H28,NC13H28,1.93 +n-C14,n-tetradecane,C14H30,NC14H30,1.31 +n-C15,n-pentadecane,C15H32,NC15H32,0.79 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.38 +n-C17,n-heptadecane,C17H36,NC17H36,0.09 +n-C18,n-octadecane,C18H38,NC18H38,0.02 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.19 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,5.81 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,5.26 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,4.58 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,2.82 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,2.5 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,1.53 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,0.65 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,0.02 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.0 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.0 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.86 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,1.21 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,1.05 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,0.8 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,0.27 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,0.09 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.0 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.0 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.0 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/posf10264_T30_init.csv b/fuellib/data/fuelData/gcData/posf10264_T30_init.csv deleted file mode 100644 index efa6e5e..0000000 --- a/fuellib/data/fuelData/gcData/posf10264_T30_init.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.026243851 -C2-Benzene,ethyl benzene ,C6H5C2H5,0.563849082 -C3-Benzene,propyl benzene,C6H5C3H7,2.170825974 -C4-Benzene,butyl benzene,C6H5C4H9,1.868676471 -C5-Benzene,pentyl benzene,C6H5C5H11,1.243556866 -C6-Benzene,hexyl benzene,C6H5C6H13,0.815117038 -C7-Benzene,heptyl benzene,C6H5C7H15,0.343926707 -C8-Benzene,octyl benzene,C6H5C8H17,0.177068058 -C9-Benzene,nonyl benzene,C6H5C9H19,0.092682255 -Diaromatic-C10,naphthalene,NAPH,0.158282571 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.563748085 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.723177759 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.397346321 -Cycloaromatic-C09,indane,INDANE,0.037303272 -Cycloaromatic-C10,tetralin,TETRA,0.167109231 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.383886527 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.470487331 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.475804054 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.289055519 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.010816054 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.2046366 -C09-Isoparaffin,2-methyl octane,C9H20-2,1.306819247 -C10-Isoparaffin,2-methyl nonane,C10H22-2,6.254544046 -C11-Isoparaffin,2-methyl decane,C11H24-2,8.347290213 -C12-Isoparaffin,2-methyl undecane,C12H26-2,6.280064982 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,5.883941158 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,5.327191919 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,3.183676728 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.074196985 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.291668253 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.044339228 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0 -n-C07,n-heptane,NC7H16,0.026471001 -n-C08,n-octane,NC8H18,0.378567896 -n-C09,n-nonane,NC9H20,1.849315933 -n-C10,n-decane,NC10H22,5.651114497 -n-C11,n-undecane,NC11H24,5.617499013 -n-C12,n-dodecane,NC12H26,4.849494222 -n-C13,n-tridecane,NC13H28,3.88941346 -n-C14,n-tetradecane,NC14H30,2.70584866 -n-C15,n-pentadecane,NC15H32,1.176763184 -n-C16,n-hexadecane (cetane),NC16H34,0.333330547 -n-C17,n-heptadecane,NC17H36,0.088344843 -n-C18,n-octadecane,NC18H38,0 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.077136106 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.395905261 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,2.052459083 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.16184899 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,4.046496274 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,3.155585379 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,3.125128759 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,1.734320799 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.157839457 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.16889367 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.031150583 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.009767699 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.232146673 -C10-Dicycloparaffin,Decalin,DECALIN,0.450631891 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.790849113 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.997193825 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.740914494 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.681235908 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.125895154 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.121105243 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/gcData/posf10264_init.csv b/fuellib/data/fuelData/gcData/posf10264_init.csv index 6b89316..693d2d7 100644 --- a/fuellib/data/fuelData/gcData/posf10264_init.csv +++ b/fuellib/data/fuelData/gcData/posf10264_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.25 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.98 -C3-Benzene,propyl benzene,C6H5C3H7,4.17 -C4-Benzene,butyl benzene,C6H5C4H9,2.33 -C5-Benzene,pentyl benzene,C6H5C5H11,1.19 -C6-Benzene,hexyl benzene,C6H5C6H13,0.66 -C7-Benzene,heptyl benzene,C6H5C7H15,0.25 -C8-Benzene,octyl benzene,C6H5C8H17,0.12 -C9-Benzene,nonyl benzene,C6H5C9H19,0.06 -Diaromatic-C10,naphthalene,NAPH,0.10 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.41 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.22 -Cycloaromatic-C09,indane,INDANE,0.02 -Cycloaromatic-C10,tetralin,TETRA,0.19 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.37 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.38 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.34 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.19 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.21 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.88 -C09-Isoparaffin,2-methyl octane,C9H20-2,2.59 -C10-Isoparaffin,2-methyl nonane,C10H22-2,8.15 -C11-Isoparaffin,2-methyl decane,C11H24-2,8.38 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.41 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.63 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.96 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.28 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.75 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.20 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.03 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 -n-C07,n-heptane,NC7H16,0.24 -n-C08,n-octane,NC8H18,1.11 -n-C09,n-nonane,NC9H20,2.97 -n-C10,n-decane,NC10H22,6.46 -n-C11,n-undecane,NC11H24,5.22 -n-C12,n-dodecane,NC12H26,3.99 -n-C13,n-tridecane,NC13H28,2.97 -n-C14,n-tetradecane,NC14H30,1.97 -n-C15,n-pentadecane,NC15H32,0.83 -n-C16,n-hexadecane (cetane),NC16H34,0.23 -n-C17,n-heptadecane,NC17H36,0.06 -n-C18,n-octadecane,NC18H38,0.00 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.51 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,1.01 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,3.06 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.47 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,3.55 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,2.45 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,2.25 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,1.19 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,0.77 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.11 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.02 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.35 -C10-Dicycloparaffin,Decalin,DECALIN,0.47 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,0.71 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,0.77 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,0.52 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.45 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.08 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.11 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.25 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,1.98 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,4.17 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,2.33 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,1.19 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,0.66 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.25 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.12 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.06 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.1 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.33 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.41 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.22 +Cycloaromatic-C09,indane,C9H10,INDANE,0.02 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.19 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,0.37 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,0.38 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,0.34 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.19 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.21 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.88 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,2.59 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,8.15 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,8.38 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,5.41 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,4.63 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,3.96 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,2.28 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,0.75 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.2 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.03 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.24 +n-C08,n-octane,C8H18,NC8H18,1.11 +n-C09,n-nonane,C9H20,NC9H20,2.97 +n-C10,n-decane,C10H22,NC10H22,6.46 +n-C11,n-undecane,C11H24,NC11H24,5.22 +n-C12,n-dodecane,C12H26,NC12H26,3.99 +n-C13,n-tridecane,C13H28,NC13H28,2.97 +n-C14,n-tetradecane,C14H30,NC14H30,1.97 +n-C15,n-pentadecane,C15H32,NC15H32,0.83 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.23 +n-C17,n-heptadecane,C17H36,NC17H36,0.06 +n-C18,n-octadecane,C18H38,NC18H38,0.0 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.51 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,1.01 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,3.06 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,4.47 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,3.55 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,2.45 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,2.25 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,1.19 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,0.77 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.11 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.02 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.35 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.47 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,0.71 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,0.77 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,0.52 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.45 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.08 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.11 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/posf10289_init.csv b/fuellib/data/fuelData/gcData/posf10289_init.csv index c4092b1..90b0c53 100644 --- a/fuellib/data/fuelData/gcData/posf10289_init.csv +++ b/fuellib/data/fuelData/gcData/posf10289_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.03 -C2-Benzene,ethyl benzene ,C6H5C2H5,0.41 -C3-Benzene,propyl benzene,C6H5C3H7,1.32 -C4-Benzene,butyl benzene,C6H5C4H9,2.09 -C5-Benzene,pentyl benzene,C6H5C5H11,1.98 -C6-Benzene,hexyl benzene,C6H5C6H13,1.80 -C7-Benzene,heptyl benzene,C6H5C7H15,1.24 -C8-Benzene,octyl benzene,C6H5C8H17,1.05 -C9-Benzene,nonyl benzene,C6H5C9H19,0.42 -Diaromatic-C10,naphthalene,NAPH,0.09 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.33 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.33 -Cycloaromatic-C09,indane,INDANE,0.03 -Cycloaromatic-C10,tetralin,TETRA,0.57 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.91 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,2.67 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,2.27 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.22 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.13 -C09-Isoparaffin,2-methyl octane,C9H20-2,0.48 -C10-Isoparaffin,2-methyl nonane,C10H22-2,1.66 -C11-Isoparaffin,2-methyl decane,C11H24-2,2.73 -C12-Isoparaffin,2-methyl undecane,C12H26-2,3.36 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,3.57 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,3.54 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.70 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,0.65 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.08 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.00 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.00 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.00 -n-C07,n-heptane,NC7H16,0.02 -n-C08,n-octane,NC8H18,0.19 -n-C09,n-nonane,NC9H20,0.64 -n-C10,n-decane,NC10H22,1.41 -n-C11,n-undecane,NC11H24,2.60 -n-C12,n-dodecane,NC12H26,3.09 -n-C13,n-tridecane,NC13H28,2.50 -n-C14,n-tetradecane,NC14H30,1.92 -n-C15,n-pentadecane,NC15H32,0.86 -n-C16,n-hexadecane (cetane),NC16H34,0.11 -n-C17,n-heptadecane,NC17H36,0.01 -n-C18,n-octadecane,NC18H38,0.00 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.08 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.35 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.53 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.25 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.77 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,6.25 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,6.11 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,4.22 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,2.27 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.41 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.01 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.46 -C10-Dicycloparaffin,Decalin,DECALIN,1.04 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,2.84 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,4.33 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,4.53 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,3.14 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.67 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.10 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.03 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,0.41 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,1.32 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,2.09 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,1.98 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,1.8 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,1.24 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,1.05 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.42 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.09 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.33 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.6 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.33 +Cycloaromatic-C09,indane,C9H10,INDANE,0.03 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.57 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,1.91 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,2.67 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,2.27 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,1.22 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.02 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.13 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,0.48 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,1.66 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,2.73 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,3.36 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,3.57 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,3.54 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,2.7 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,0.65 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.08 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.0 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.0 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.0 +n-C07,n-heptane,C7H16,NC7H16,0.02 +n-C08,n-octane,C8H18,NC8H18,0.19 +n-C09,n-nonane,C9H20,NC9H20,0.64 +n-C10,n-decane,C10H22,NC10H22,1.41 +n-C11,n-undecane,C11H24,NC11H24,2.6 +n-C12,n-dodecane,C12H26,NC12H26,3.09 +n-C13,n-tridecane,C13H28,NC13H28,2.5 +n-C14,n-tetradecane,C14H30,NC14H30,1.92 +n-C15,n-pentadecane,C15H32,NC15H32,0.86 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.11 +n-C17,n-heptadecane,C17H36,NC17H36,0.01 +n-C18,n-octadecane,C18H38,NC18H38,0.0 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.08 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,0.35 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,1.53 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,3.25 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,5.77 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,6.25 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,6.11 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,4.22 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,2.27 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.41 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.01 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.46 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,1.04 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,2.84 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,4.33 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,4.53 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,3.14 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.67 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.1 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/posf10325_init.csv b/fuellib/data/fuelData/gcData/posf10325_init.csv index 7bd11cf..81e117c 100644 --- a/fuellib/data/fuelData/gcData/posf10325_init.csv +++ b/fuellib/data/fuelData/gcData/posf10325_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.17 -C2-Benzene,ethyl benzene ,C6H5C2H5,1.10 -C3-Benzene,propyl benzene,C6H5C3H7,2.97 -C4-Benzene,butyl benzene,C6H5C4H9,3.32 -C5-Benzene,pentyl benzene,C6H5C5H11,2.22 -C6-Benzene,hexyl benzene,C6H5C6H13,1.45 -C7-Benzene,heptyl benzene,C6H5C7H15,0.73 -C8-Benzene,octyl benzene,C6H5C8H17,0.52 -C9-Benzene,nonyl benzene,C6H5C9H19,0.42 -Diaromatic-C10,naphthalene,NAPH,0.22 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.66 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.86 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.60 -Cycloaromatic-C09,indane,INDANE,0.02 -Cycloaromatic-C10,tetralin,TETRA,0.26 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,0.66 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,0.89 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,0.85 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,0.61 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.15 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.44 -C09-Isoparaffin,2-methyl octane,C9H20-2,1.05 -C10-Isoparaffin,2-methyl nonane,C10H22-2,4.20 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.70 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.63 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,4.22 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.20 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,2.51 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.00 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.39 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.11 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.03 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.03 -n-C07,n-heptane,NC7H16,0.17 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1.42 -n-C10,n-decane,NC10H22,3.26 -n-C11,n-undecane,NC11H24,4.29 -n-C12,n-dodecane,NC12H26,3.74 -n-C13,n-tridecane,NC13H28,2.80 -n-C14,n-tetradecane,NC14H30,2.02 -n-C15,n-pentadecane,NC15H32,1.03 -n-C16,n-hexadecane (cetane),NC16H34,0.43 -n-C17,n-heptadecane,NC17H36,0.21 -n-C18,n-octadecane,NC18H38,0.06 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.36 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.78 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,2.30 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,4.11 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,5.43 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,3.73 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,4.19 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.19 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.33 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.42 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.24 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.03 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.43 -C10-Dicycloparaffin,Decalin,DECALIN,0.72 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.52 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.57 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.21 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.81 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.27 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.16 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.17 +C2-Benzene,ethyl benzene ,C8H10,C6H5C2H5,1.1 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,2.97 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,3.32 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,2.22 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,1.45 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,0.73 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.52 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,0.42 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.22 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.66 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.86 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.6 +Cycloaromatic-C09,indane,C9H10,INDANE,0.02 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.26 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,0.66 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,0.89 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,0.85 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,0.61 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.15 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.44 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,1.05 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,4.2 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,5.7 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,5.63 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,4.22 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,4.2 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,2.51 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,1.0 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.39 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.11 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.03 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.03 +n-C07,n-heptane,C7H16,NC7H16,0.17 +n-C08,n-octane,C8H18,NC8H18,0.54 +n-C09,n-nonane,C9H20,NC9H20,1.42 +n-C10,n-decane,C10H22,NC10H22,3.26 +n-C11,n-undecane,C11H24,NC11H24,4.29 +n-C12,n-dodecane,C12H26,NC12H26,3.74 +n-C13,n-tridecane,C13H28,NC13H28,2.8 +n-C14,n-tetradecane,C14H30,NC14H30,2.02 +n-C15,n-pentadecane,C15H32,NC15H32,1.03 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.43 +n-C17,n-heptadecane,C17H36,NC17H36,0.21 +n-C18,n-octadecane,C18H38,NC18H38,0.06 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.36 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,0.78 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,2.3 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,4.11 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,5.43 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,3.73 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,4.19 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,2.19 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,1.33 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.42 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.24 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.03 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.43 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.72 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,1.52 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,1.57 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,1.21 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.81 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.27 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.16 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/gcData/posf11498_init.csv b/fuellib/data/fuelData/gcData/posf11498_init.csv index fd876d2..c04dd00 100644 --- a/fuellib/data/fuelData/gcData/posf11498_init.csv +++ b/fuellib/data/fuelData/gcData/posf11498_init.csv @@ -1,14 +1,14 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.02 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.61 -C09-Isoparaffin,2-methyl octane,C9H20-2,0.17 -C10-Isoparaffin,2-methyl nonane,C10H22-2,0.22 -C11-Isoparaffin,2-methyl decane,C11H24-2,0.52 -C12-Isoparaffin,2-methyl undecane,C12H26-2,78.28 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,1.23 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,0.53 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,16.25 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,1.69 -C24-Isoparaffin,2-methyltricosane,C24H50-2,0.12 -C12-Alkene,1-dodecene,DODECENE-1,0.08 -C16-Alkene,1-hexadecene,HEXADECENE-1,0.24 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.02 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.61 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,0.17 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,0.22 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,0.52 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,78.28 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,1.23 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,0.53 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,16.25 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,1.69 +C24-Isoparaffin,2-methyltricosane,C24H50,C24H50-2,0.12 +C12-Alkene,1-dodecene,C12H24,DODECENE-1,0.08 +C16-Alkene,1-hexadecene,C16H32,HEXADECENE-1,0.24 diff --git a/fuellib/data/fuelData/gcData/posf4658_init.csv b/fuellib/data/fuelData/gcData/posf4658_init.csv index 2f1d77b..5f5746f 100644 --- a/fuellib/data/fuelData/gcData/posf4658_init.csv +++ b/fuellib/data/fuelData/gcData/posf4658_init.csv @@ -1,68 +1,68 @@ -Compound,Reference Compound,PelePhysics Key,Weight % -Toluene,toluene,C6H5CH3,0.16 -C2-Benzene,ethyl benzene,C6H5C2H5,0.78 -C3-Benzene,propyl benzene,C6H5C3H7,2.24 -C4-Benzene,butyl benzene,C6H5C4H9,3.02 -C5-Benzene,pentyl benzene,C6H5C5H11,2.48 -C6-Benzene,hexyl benzene,C6H5C6H13,1.93 -C7-Benzene,heptyl benzene,C6H5C7H15,1.19 -C8-Benzene,octyl benzene,C6H5C8H17,0.89 -C9-Benzene,nonyl benzene,C6H5C9H19,1.00 -Diaromatic-C10,naphthalene,NAPH,0.12 -Diaromatic-C11,1-methyl naphthalene,METHYLNAPH-1,0.42 -Diaromatic-C12,1-ethyl naphthalene,ETHYLNAPH-1,0.60 -Diaromatic-C13,1-propyl naphthalene,PROPYLNAPH-1,0.63 -Cycloaromatic-C09,indane,INDANE,0.04 -Cycloaromatic-C10,tetralin,TETRA,0.43 -Cycloaromatic-C11,2-methyl tetralin,METHYLTETRA-2,1.13 -Cycloaromatic-C12,2-ethly tetralin,ETHYLTETRA-2,1.63 -Cycloaromatic-C13,2-propyl tetralin,PROPYLTETRA-2,1.45 -Cycloaromatic-C14,2-butyl tetralin,BUTYLTETRA-2,1.12 -C07-Isoparaffin,2-methyl hexane,C7H16-2,0.23 -C08-Isoparaffin,2-methyl heptane,C8H18-2,0.56 -C09-Isoparaffin,2-methyl octane,C9H20-2,1.08 -C10-Isoparaffin,2-methyl nonane,C10H22-2,3.59 -C11-Isoparaffin,2-methyl decane,C11H24-2,5.12 -C12-Isoparaffin,2-methyl undecane,C12H26-2,5.31 -C13-Isoparaffin,2-methyl dodecane,C13H28-2,5.25 -C14-Isoparaffin,2-methyl tridecane,C14H30-2,4.44 -C15-Isoparaffin,2-methyl tetradecane,C15H32-2,3.10 -C16-Isoparaffin,2-methyl pentadecane,C16H34-2,1.66 -C17-Isoparaffin,2-methyl hexadecane,C17H36-2,0.69 -C18-Isoparaffin,2-methyl heptadecane,C18H38-2,0.19 -C19-Isoparaffin,2-methyl octadecane,C19H40-2,0.08 -C20-Isoparaffin,2-methyl nonadecane,C20H42-2,0.02 -n-C07,n-heptane,NC7H16,0.15 -n-C08,n-octane,NC8H18,0.54 -n-C09,n-nonane,NC9H20,1.14 -n-C10,n-decane,NC10H22,2.55 -n-C11,n-undecane,NC11H24,3.62 -n-C12,n-dodecane,NC12H26,3.70 -n-C13,n-tridecane,NC13H28,2.86 -n-C14,n-tetradecane,NC14H30,2.17 -n-C15,n-pentadecane,NC15H32,1.28 -n-C16,n-hexadecane (cetane),NC16H34,0.61 -n-C17,n-heptadecane,NC17H36,0.27 -n-C18,n-octadecane,NC18H38,0.07 -C07-Monocycloparaffin,methyl cyclohexane,C6H11CH3,0.20 -C08-Monocycloparaffin,ethyl cyclohexane,C6H11C2H5,0.69 -C09-Monocycloparaffin,propyl cyclohexane,C6H11C3H7,1.67 -C10-Monocycloparaffin,butyl cyclohexane,C6H11C4H9,3.26 -C11-Monocycloparaffin,pentyl cyclohexane,C6H11C5H11,4.11 -C12-Monocycloparaffin,hexyl cyclohexane,C6H11C6H13,4.07 -C13-Monocycloparaffin,heptyl cyclohexane,C6H11C7H15,3.65 -C14-Monocycloparaffin,octyl cyclohexane,C6H11C8H17,2.43 -C15-Monocycloparaffin,nonyl cyclohexane,C6H11C9H19,1.55 -C16-Monocycloparaffin,decyl cyclohexane,C6H11C10H21,0.64 -C17-Monocycloparaffin,undecyl cyclohexane,C6H11C11H23,0.37 -C08-Dicycloparaffin,Octahydropentalene,OHPEN,0.02 -C09-Dicycloparaffin,Hydrindane,HYDRIND,0.29 -C10-Dicycloparaffin,Decalin,DECALIN,0.43 -C11-Dicycloparaffin,2-methyldecalin,METHYLDECALIN-2,1.26 -C12-Dicycloparaffin,2-ethyldecalin,ETHYLDECALIN-2,1.22 -C13-Dicycloparaffin,2-propyldecalin,PROPYLDECALIN-2,1.42 -C14-Dicycloparaffin,2-butyldecalin,BUTYLDECALIN-2,0.82 -C15-Dicycloparaffin,2-pentyldacalin,PENTYLDECALIN-2,0.26 -C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,TRICYCLO-C10,0.00 -C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,TRICYCLO-C11,0.05 -C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,TRICYCLO-C12,0.00 \ No newline at end of file +Compound,Reference Compound,Formula,PelePhysics Key,Weight % +Toluene,toluene,C7H8,C6H5CH3,0.16 +C2-Benzene,ethyl benzene,C8H10,C6H5C2H5,0.78 +C3-Benzene,propyl benzene,C9H12,C6H5C3H7,2.24 +C4-Benzene,butyl benzene,C10H14,C6H5C4H9,3.02 +C5-Benzene,pentyl benzene,C11H16,C6H5C5H11,2.48 +C6-Benzene,hexyl benzene,C12H18,C6H5C6H13,1.93 +C7-Benzene,heptyl benzene,C13H20,C6H5C7H15,1.19 +C8-Benzene,octyl benzene,C14H22,C6H5C8H17,0.89 +C9-Benzene,nonyl benzene,C15H24,C6H5C9H19,1.0 +Diaromatic-C10,naphthalene,C10H8,NAPH,0.12 +Diaromatic-C11,1-methyl naphthalene,C11H10,METHYLNAPH-1,0.42 +Diaromatic-C12,1-ethyl naphthalene,C12H12,ETHYLNAPH-1,0.6 +Diaromatic-C13,1-propyl naphthalene,C13H14,PROPYLNAPH-1,0.63 +Cycloaromatic-C09,indane,C9H10,INDANE,0.04 +Cycloaromatic-C10,tetralin,C10H12,TETRA,0.43 +Cycloaromatic-C11,2-methyl tetralin,C11H14,METHYLTETRA-2,1.13 +Cycloaromatic-C12,2-ethly tetralin,C12H16,ETHYLTETRA-2,1.63 +Cycloaromatic-C13,2-propyl tetralin,C13H18,PROPYLTETRA-2,1.45 +Cycloaromatic-C14,2-butyl tetralin,C14H20,BUTYLTETRA-2,1.12 +C07-Isoparaffin,2-methyl hexane,C7H16,C7H16-2,0.23 +C08-Isoparaffin,2-methyl heptane,C8H18,C8H18-2,0.56 +C09-Isoparaffin,2-methyl octane,C9H20,C9H20-2,1.08 +C10-Isoparaffin,2-methyl nonane,C10H22,C10H22-2,3.59 +C11-Isoparaffin,2-methyl decane,C11H24,C11H24-2,5.12 +C12-Isoparaffin,2-methyl undecane,C12H26,C12H26-2,5.31 +C13-Isoparaffin,2-methyl dodecane,C13H28,C13H28-2,5.25 +C14-Isoparaffin,2-methyl tridecane,C14H30,C14H30-2,4.44 +C15-Isoparaffin,2-methyl tetradecane,C15H32,C15H32-2,3.1 +C16-Isoparaffin,2-methyl pentadecane,C16H34,C16H34-2,1.66 +C17-Isoparaffin,2-methyl hexadecane,C17H36,C17H36-2,0.69 +C18-Isoparaffin,2-methyl heptadecane,C18H38,C18H38-2,0.19 +C19-Isoparaffin,2-methyl octadecane,C19H40,C19H40-2,0.08 +C20-Isoparaffin,2-methyl nonadecane,C20H42,C20H42-2,0.02 +n-C07,n-heptane,C7H16,NC7H16,0.15 +n-C08,n-octane,C8H18,NC8H18,0.54 +n-C09,n-nonane,C9H20,NC9H20,1.14 +n-C10,n-decane,C10H22,NC10H22,2.55 +n-C11,n-undecane,C11H24,NC11H24,3.62 +n-C12,n-dodecane,C12H26,NC12H26,3.7 +n-C13,n-tridecane,C13H28,NC13H28,2.86 +n-C14,n-tetradecane,C14H30,NC14H30,2.17 +n-C15,n-pentadecane,C15H32,NC15H32,1.28 +n-C16,n-hexadecane (cetane),C16H34,NC16H34,0.61 +n-C17,n-heptadecane,C17H36,NC17H36,0.27 +n-C18,n-octadecane,C18H38,NC18H38,0.07 +C07-Monocycloparaffin,methyl cyclohexane,C7C14,C6H11CH3,0.2 +C08-Monocycloparaffin,ethyl cyclohexane,C8H16,C6H11C2H5,0.69 +C09-Monocycloparaffin,propyl cyclohexane,C9H18,C6H11C3H7,1.67 +C10-Monocycloparaffin,butyl cyclohexane,C10H20,C6H11C4H9,3.26 +C11-Monocycloparaffin,pentyl cyclohexane,C11H22,C6H11C5H11,4.11 +C12-Monocycloparaffin,hexyl cyclohexane,C12H24,C6H11C6H13,4.07 +C13-Monocycloparaffin,heptyl cyclohexane,C13H26,C6H11C7H15,3.65 +C14-Monocycloparaffin,octyl cyclohexane,C14H28,C6H11C8H17,2.43 +C15-Monocycloparaffin,nonyl cyclohexane,C15H30,C6H11C9H19,1.55 +C16-Monocycloparaffin,decyl cyclohexane,C16H32,C6H11C10H21,0.64 +C17-Monocycloparaffin,undecyl cyclohexane,C17H34,C6H11C11H23,0.37 +C08-Dicycloparaffin,Octahydropentalene,C8H14,OHPEN,0.02 +C09-Dicycloparaffin,Hydrindane,C9H16,HYDRIND,0.29 +C10-Dicycloparaffin,Decalin,C10H18,DECALIN,0.43 +C11-Dicycloparaffin,2-methyldecalin,C11H20,METHYLDECALIN-2,1.26 +C12-Dicycloparaffin,2-ethyldecalin,C12H22,ETHYLDECALIN-2,1.22 +C13-Dicycloparaffin,2-propyldecalin,C13H24,PROPYLDECALIN-2,1.42 +C14-Dicycloparaffin,2-butyldecalin,C14H26,BUTYLDECALIN-2,0.82 +C15-Dicycloparaffin,2-pentyldacalin,C15H28,PENTYLDECALIN-2,0.26 +C10-Tricycloparaffin,C1CC2C(C1)C1CCCC21,C10H16,TRICYCLO-C10,0.0 +C11-Tricycloparaffin,C1CC2CC3CCCC3C2C1,C11H18,TRICYCLO-C11,0.05 +C12-Tricycloparaffin,C1CC2CC3CCCC3CC2C1,C12H20,TRICYCLO-C12,0.0 diff --git a/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv b/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv deleted file mode 100644 index 053c076..0000000 --- a/fuellib/data/fuelData/groupDecompositionData/hefa-S1.csv +++ /dev/null @@ -1,3 +0,0 @@ -Compound,CH3 (1),CH2 (2),CH (3),C (4),CH2=CH (1),CH=CH (2),CH2=C (2),CH=C (3),C=C (4),CH2=C=CH(1),ACH (2),AC (3),ACCH3 (2),ACCH2 (3),ACCH (4),OH (1),ACOH (2),CH3CO (1),CH2CO (2),CHO (1)*,CH3COO (1),CH2COO (2),HCOO (1),CH30 (1),CH20 (2),CH-O (3),FCH20 (1)*,CH2NH2 (1),CHNH2 (2),CH3NH (2),CH2NH (3),CHNH (4)*,CH3N (2),CH2N (3),ACNH2 (2),C5H4N (1),C5H3N (2),CH2CN (1)*,COOH (1),CH2C1 (1),CHC1 (2),CC1 (3),CHC12 (1)*,CC13 (1),CC12 (2),ACC1 (2),CH2N02 (1)*,CHN02 (2)*,ACN02 (2)*,CH2SH (1),C1(1)*,Br (1),CH≡C (1),C≡C (2)*,Cl—(C=C) (3)*,ACF (2),HCON(CH2)2 (2)*,CF3 (1),CF2 (2),CF (3),COO (2),CC12F (1),HCC1F (1),CC1F2 (1),FSpecial (1),CONH2 (1)*,CONHCH3 (1)*,CONHCH2 (1)*,CON(CH3)2 (1)*,CONCH2CH2 (3)*,CON(CH2)2 (3)*,C2H502 (1)*,C2H402 (2),CH3S (1),CH2S (2),CHS (3)*,C4H3S (1),C4H2S (2)*,Group j (CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CR=CRm—CRp=CRk m, p G (0,1), K n G (0,2)","CH3-CHm=CH, m G (0,1), n G (0,2)","CH2-CHm=CH, m G (0,1), n G (0,2)","CH—CUm=CUn or C—CHm=CH/ m G (0,1), n G (0,2)",Alicyclic side-chain CcyclicCm m > 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* -2-methylnonane,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -undecane,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv b/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv deleted file mode 100644 index 7bfdb20..0000000 --- a/fuellib/data/fuelData/groupDecompositionData/hefa-WE-SAF-262714.csv +++ /dev/null @@ -1,33 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin (lower put as same),3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C05-Monocycloparaffin,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index 4df94cb..0f8aedb 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -16,15 +16,10 @@ The file contains mixture properties for the fuel, formatted for Converge. Usage: - fl-export-converge --fuel_name - -Options: - --units - --temp_min (K) - --temp_max (K) - --temp_step (K) - --export_dir - --export_mix + fl-export-converge -f + +For detailed options, run: + fl-export-converge -h """ diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index fdea89e..338729a 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -19,20 +19,10 @@ the fuel, formatted for Pele. Usage: - fl-export-pele --fuel_name - -Options: - --units - --fuel_decomp_name - --fuel_data_dir - --dep_fuel_names - --use_pp_keys - --export_dir - --export_mix - --export_mix_name - --fuel_data_dir - --liq_prop_model - --psat_antoine + fl-export-pele -f + +For detailed options, run: + fl-export-pele -h """ diff --git a/fuellib/utilities/fuel_manager.py b/fuellib/utilities/fuel_manager.py new file mode 100644 index 0000000..b6369c5 --- /dev/null +++ b/fuellib/utilities/fuel_manager.py @@ -0,0 +1,144 @@ +""" +Utilities for managing and querying the fuel library. + +This module provides tools for listing and discovering available fuels +in the FuelLib database, including source information and metadata. +""" + +import os +import argparse +import fuellib as fl + +try: + import yaml + HAS_YAML = True +except ImportError: + HAS_YAML = False + + +def load_fuel_metadata(fuel_data_dir=None): + """ + Load fuel metadata from YAML file if available. + + :param fuel_data_dir: Optional directory containing fuel data (e.g., customFuels/fuelData). + If None, loads from embedded FuelLib data. + :type fuel_data_dir: str, optional + :return: Dictionary of fuel metadata or empty dict if not available + :rtype: dict + """ + if not HAS_YAML: + return {} + + # Determine which metadata file to load + if fuel_data_dir is None: + # Load from embedded data + metadata_file = os.path.join( + fl.get_fueldata_dir(), + "fuel_metadata.yaml" + ) + else: + # Load from custom directory + metadata_file = os.path.join(fuel_data_dir, "fuel_metadata.yaml") + + try: + if os.path.exists(metadata_file): + with open(metadata_file, 'r') as f: + data = yaml.safe_load(f) + return data.get('fuels', {}) if data else {} + except Exception as e: + pass + + return {} + + +def list_fuels_main(): + """ + Entry point for fl-fuels command - List all available fuels in the library. + """ + parser = argparse.ArgumentParser( + description="List all available fuels in the FuelLib library." + ) + + parser.add_argument( + "-dir", + "--fuel_data_dir", + default=None, + metavar="PATH", + help="Directory where fuel data files are located (e.g., customFuels/fuelData). If not specified, uses embedded FuelLib data.", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="Show detailed information including source and category for each fuel.", + ) + + args = parser.parse_args() + + if args.fuel_data_dir is None: + fuel_data_dir = fl.get_fueldata_gc_dir() + metadata_dir = None # Use embedded metadata + else: + fuel_data_dir = os.path.join(args.fuel_data_dir, "gcData") + metadata_dir = args.fuel_data_dir # Load metadata from same custom directory + + try: + # List all fuel files in the gcData directory + if not os.path.exists(fuel_data_dir): + print(f"Error: Fuel data directory not found: {fuel_data_dir}") + exit(1) + + # Extract fuel names from *_init.csv files + fuel_files = [f for f in os.listdir(fuel_data_dir) if f.endswith("_init.csv")] + fuel_names = sorted([f.replace("_init.csv", "") for f in fuel_files]) + + if not fuel_names: + print("No fuels found in the specified directory.") + exit(0) + + # Load metadata from the appropriate location + metadata = load_fuel_metadata(metadata_dir) + + print("\n" + "=" * 80) + if args.fuel_data_dir: + print(f"Available Fuels in {args.fuel_data_dir}") + else: + print("Available Fuels in FuelLib") + print("=" * 80) + + if args.verbose and metadata: + # Verbose output with metadata + for i, fuel_name in enumerate(fuel_names, 1): + meta = metadata.get(fuel_name, {}) + category = meta.get('category', 'Unknown') + source = meta.get('source') + description = meta.get('description', '') + + print(f"{i:2d}. {fuel_name}") + print(f" Category: {category}") + if source: + print(f" Source: {source}") + if description: + print(f" Note: {description}") + print() + else: + # Simple list output + for i, fuel_name in enumerate(fuel_names, 1): + if metadata and fuel_name in metadata: + source = metadata[fuel_name].get('source', '') + if source: + print(f"{i:2d}. {fuel_name:<20} [{source}]") + else: + print(f"{i:2d}. {fuel_name}") + else: + print(f"{i:2d}. {fuel_name}") + + print("=" * 80) + print(f"Total: {len(fuel_names)} fuel(s)") + if not args.verbose and metadata: + print("Use -v/--verbose for detailed information including source and category") + print("=" * 80 + "\n") + + except Exception as e: + print(f"Error listing fuels: {e}") + exit(1) diff --git a/fuellib/utilities/plotting.py b/fuellib/utilities/plotting.py new file mode 100644 index 0000000..83fb928 --- /dev/null +++ b/fuellib/utilities/plotting.py @@ -0,0 +1,758 @@ +""" +Utilities for plotting fuel properties and composition. + +This module provides functions for visualizing: +- Fuel composition by compound and chemical family +- Mixture properties over a temperature range +""" + +import os +import re +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import argparse +import fuellib as fl + + +def plot_composition(fuel_name, fuel_data_dir=None, output_dir=None, title=None, decomp_name=None, save=True, display=False): + """ + Plot the composition of a given fuel. + + :param fuel_name: Name of the fuel to plot. + :type fuel_name: str + :param fuel_data_dir: Directory where fuel data files are located (optional). + :type fuel_data_dir: str, optional + :param output_dir: Directory to save the plot (optional, default: current directory). + :type output_dir: str, optional + :param title: Title for the plots (optional, default: fuel_name, or "none"/"None" to disable). + :type title: str, optional + :param decomp_name: Name of the decomposition file to use (optional, default: fuel_name). + :type decomp_name: str, optional + :param save: Whether to save the plot to a file (optional, default: True). + :type save: bool, optional + :param display: Whether to display the plot with plt.show() (optional, default: False). + :type display: bool, optional + """ + if output_dir is None: + output_dir = os.getcwd() + + # Handle title + plot_title = None + if title is None: + plot_title = "Fuel Composition" + elif title.lower() != "none": + plot_title = title + + if fuel_data_dir is None: + fuel_data_dir = fl.get_fueldata_dir() + + if save and not os.path.exists(output_dir): + os.makedirs(output_dir) + + # Load the fuel + fuel = fl.fuel(fuel_name, decompName=decomp_name, fuelDataDir=fuel_data_dir) + + # Create DataFrame with compound data + family_names = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic"] + df = pd.DataFrame({ + "Compound": fuel.compounds, + "Weight %": fuel.Y_0 * 100, + "Family": fuel.hc_type, + }) + + # Determine carbon number from compound name + def determine_carbon_number(compound): + """Extract carbon number from compound name.""" + if "Toluene" in compound: + return 7 + elif "benzene" in compound.lower(): + match = re.search(r"C(\d+)", compound) + if match: + try: + return int(match.group(1)) + 6 + except ValueError: + return np.nan + return np.nan + else: + match = re.search(r"C(\d+)", compound) + if match: + try: + return int(match.group(1)) + except ValueError: + return np.nan + return np.nan + + df["nC"] = df["Compound"].apply(determine_carbon_number) + + # Remove rows with weight % <= 0.01 + df = df[df["Weight %"] > 0.01] + + # Calculate family weights + family_weights = df.groupby("Family")["Weight %"].sum() + + # Print composition table + print(f"\n{'=' * 50}") + print("Relative Weight % of Each Compound Family") + print(f"Fuel: {fuel_name}") + print("=" * 50) + for family, weight in family_weights.items(): + print(f" {family:<20} {weight:>8.2f}%") + print("-" * 50) + print(f" {'Total':<20} {family_weights.sum():>8.2f}%") + print("=" * 50 + "\n") + + # Color scheme + colors = { + "n-alkane": "#063C61", + "iso-alkane": "#2980B9", + "cyclo-alkane": "#91BCD8", + "alkene": "#663399", + "aromatic": "#7f7f7f", + } + + # Create figure with two subplots side by side + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), constrained_layout=True) + + # Plot 1: Bar chart grouped by carbon number + spacing = [-0.2985, -0.099, 0.099, 0.2985] + N = df.nC.unique() + families_in_data = df["Family"].unique() + + for k, family in enumerate(family_names): + if family not in families_in_data: + continue + df_family = df[df["Family"] == family] + nC = df_family.nC + weight = df_family["Weight %"] + + # Check for duplicate carbon numbers and sum weights + if len(nC) != len(set(nC)): + df_grouped = df_family.groupby("nC")["Weight %"].sum().reset_index() + nC = df_grouped["nC"] + weight = df_grouped["Weight %"] + + ax1.bar( + nC + spacing[k], + weight, + label=family, + alpha=1, + color=colors.get(family, "#7f7f7f"), + width=0.2, + ) + + ax1.set_xlabel("Carbon Number", fontsize=16) + ax1.set_xticks(sorted(N)) + ax1.set_xticklabels(sorted(N), fontsize=14) + ax1.set_xlim(min(N) - 0.5, max(N) + 0.5) + ax1.set_ylabel("Weight %", fontsize=16) + ax1.tick_params(axis="y", labelsize=14) + ax1.grid(axis="y", alpha=0.3) + ax1.legend(fontsize=12, loc="upper left") + + # Plot 2: Pie chart of family composition + # Only include families that have weight > 0 + families_present = [f for f in family_names if f in family_weights.index and family_weights[f] > 0] + family_weights_sorted = family_weights[families_present] + + # Create pie chart without labels/percentages (we'll add them outside) + wedges, texts = ax2.pie( + family_weights_sorted, + labels=None, + autopct=None, + startangle=140, + colors=[colors.get(family, "#7f7f7f") for family in family_weights_sorted.index], + ) + + # Add percentages outside the pie with arrows + for wedge, value, family in zip(wedges, family_weights_sorted.values, family_weights_sorted.index): + angle = (wedge.theta2 + wedge.theta1) / 2 + radius = 1.3 + x = radius * np.cos(np.radians(angle)) + y = radius * np.sin(np.radians(angle)) + + # Determine horizontal alignment based on position + ha = "left" if x > 0 else "right" + + # Add annotation with arrow + ax2.annotate( + f"{value:.1f}%", + xy=(np.cos(np.radians(angle)), np.sin(np.radians(angle))), + xytext=(x, y), + ha=ha, + va="center", + fontsize=14, + fontweight="bold", + arrowprops=dict(arrowstyle="-", color="black", lw=1.5), + ) + + ax2.axis("equal") + + # Add a single figure-level legend for all families + legend_handles = [ + plt.Rectangle((0, 0), 1, 1, fc=colors.get(family, "#7f7f7f")) + for family in family_weights_sorted.index + ] + fig.legend( + legend_handles, + family_weights_sorted.index, + loc="upper center", + bbox_to_anchor=(0.5, -0.02), + ncol=4, + fontsize=13, + frameon=True, + ) + + # Add title if specified + if plot_title: + fig.suptitle(plot_title, fontsize=16, fontweight="bold") + + # Save the plot if requested + if save: + plot_file = os.path.join(output_dir, f"composition_{fuel_name}.png") + fig.savefig(plot_file, dpi=300, bbox_inches="tight") + print(f"Composition plot saved to {plot_file}") + + # Display the plot if requested + if display: + plt.show() + else: + plt.close(fig) + + +def plot_mixture_properties( + fuel_names, property_names=None, fuel_data_dir=None, output_dir=None, title=None, decomp_name=None, save=True, display=False +): + """ + Plot mixture properties for fuel(s) over a temperature range. + + :param fuel_names: Name or list of fuel names to plot. + :type fuel_names: str or list[str] + :param property_names: Properties to plot (optional, defaults to standard set). + :type property_names: list[str], optional + :param fuel_data_dir: Directory where fuel data files are located (optional). + :type fuel_data_dir: str, optional + :param output_dir: Directory to save the plot (optional, default: current directory). + :type output_dir: str, optional + :param title: Title for the plot (optional, default: None). + :type title: str, optional + :param decomp_name: Name of the decomposition file to use (optional, default: fuel_name). + :type decomp_name: str, optional + :param save: Whether to save the plot to a file (optional, default: True). + :type save: bool, optional + :param display: Whether to display the plot with plt.show() (optional, default: False). + :type display: bool, optional + """ + if output_dir is None: + output_dir = os.getcwd() + + if fuel_data_dir is None: + fuel_data_dir = fl.get_fueldata_dir() + + if save and not os.path.exists(output_dir): + os.makedirs(output_dir) + + # Handle single fuel_name or list + if isinstance(fuel_names, str): + fuel_names = [fuel_names] + + # Default properties if not specified + if property_names is None: + property_names = [ + "Density", + "Viscosity", + "VaporPressure", + "SurfaceTension", + "ThermalConductivity", + ] + + # Default temperature ranges (in °C) for different properties + default_ranges_by_property = { + "Density": [-40, 40], + "Viscosity": [-40, 100], + "VaporPressure": [0, 125], + "SurfaceTension": [-10, 40], + "ThermalConductivity": [0, 60], + } + + # Deprecated: fuel-specific ranges (kept for reference, now using property-based) + default_ranges = { + "posf10264": [-40, 125], + "posf10325": [-40, 125], + "posf10289": [-40, 125], + "posf11498": [-40, 125], + "jet-a": [-40, 125], + "hefa": [-40, 125], + "decane": [-50, 100], + "dodecane": [-50, 100], + "heptane": [-50, 100], + } + + # Y-axis labels + ylab = { + "Density": r"Density [g/cm$^3$]", + "Viscosity": r"Viscosity [mm$^2$/s]", + "VaporPressure": r"Vapor Pressure [kPa]", + "SurfaceTension": r"Surface Tension [N/m]", + "ThermalConductivity": r"Thermal Conductivity [W/m/K]", + } + + # Line specs for different fuels + line_specs_map = { + "decane": ("o", "o"), + "posf10325": ("o", "o"), + "dodecane": ("s", "s"), + "posf10289": ("s", "s"), + "heptane": ("D", "D"), + "posf10264": ("D", "D"), + "posf11498": ("^", "^"), + "jet-a": ("v", "v"), + "hefa": ("p", "p"), + } + + # Color palette for cycling through distinct colors + color_palette = [ + "#2980B9", # Medium blue + "#e74c3c", # Red + "#27ae60", # Green + "#8e44ad", # Purple + "#f39c12", # Orange + "#1abc9c", # Turquoise + "#c0392b", # Dark red + "#16a085", # Dark turquoise + "#d35400", # Dark orange + ] + + def get_line_spec(fuel_name, fuel_index=0): + """Get line color and marker style for fuel. + + :param fuel_name: Name of the fuel + :param fuel_index: Index of fuel in the plot (for cycling through colors) + :return: Tuple of (color, marker_style) + """ + # Get marker style from map + marker_style = "o" # Default + for key, spec in line_specs_map.items(): + if key in fuel_name.lower(): + marker_style = spec[0] + break + + # Get color from palette using fuel index + color = color_palette[fuel_index % len(color_palette)] + return (color, marker_style) + + def get_legend_label(fuel_name): + """Create legend label for fuel.""" + if "hefa" in fuel_name.lower(): + return fuel_name.upper() + elif "posf" in fuel_name.lower(): + return fuel_name[4:].upper() + else: + return fuel_name.capitalize() + + def get_temp_range(prop_name): + """Get default temperature range for a property.""" + return default_ranges_by_property.get(prop_name, [0, 100]) # Fallback to [0, 100] + + def get_predictions_and_data(fuel_name, prop_name): + """Get predicted and experimental data for a property.""" + fuel = fl.fuel(fuel_name, decompName=decomp_name, fuelDataDir=fuel_data_dir) + + # Try to load experimental data + props_dir = fl.get_fueldata_props_dir() + data_file = os.path.join(props_dir, f"{fuel_name}.csv") + + T_data = pd.Series(dtype=float) + prop_data = pd.Series(dtype=float) + + if os.path.exists(data_file): + try: + data = pd.read_csv(data_file, skiprows=[1]) + if prop_name in data.columns: + mask = data[prop_name].notna() + T_data = data.loc[mask, "Temperature"] + prop_data = data.loc[mask, prop_name] + except Exception: + pass + + # Generate predictions over temperature range + # First check if experimental data exists - use its range if available + if len(T_data) > 0: + # Use data range if available + T_pred = fl.C2K(np.linspace(T_data.min(), T_data.max(), 100)) + else: + # Use property-specific default range + temp_min, temp_max = get_temp_range(prop_name) + T_pred = fl.C2K(np.linspace(temp_min, temp_max, 100)) + + pred = np.zeros_like(T_pred) + Y_li = fuel.Y_0 + + for i, T in enumerate(T_pred): + try: + if prop_name == "Density": + pred[i] = fuel.mixture_density(Y_li, T) * 1.0e-03 # Convert to g/cm^3 + elif prop_name == "VaporPressure": + pred[i] = fuel.mixture_vapor_pressure(Y_li, T) * 1.0e-03 # Convert to kPa + elif prop_name == "Viscosity": + pred[i] = fuel.mixture_kinematic_viscosity(Y_li, T) * 1.0e6 # Convert to mm^2/s + elif prop_name == "SurfaceTension": + pred[i] = fuel.mixture_surface_tension(Y_li, T) + elif prop_name == "ThermalConductivity": + pred[i] = fuel.mixture_thermal_conductivity(Y_li, T) + except Exception: + pred[i] = np.nan + + return T_data, prop_data, T_pred, pred + + # Create figure with subplots + n_props = len(property_names) + figW = 4.25 * n_props + fig, ax = plt.subplots( + 1, n_props, figsize=(figW, 5.5), constrained_layout=True + ) + + # Handle single subplot case + if n_props == 1: + ax = [ax] + + # Plot properties for each fuel + for i, prop_name in enumerate(property_names): + for fuel_idx, fuel_name in enumerate(fuel_names): + T_data, prop_data, T_pred, pred = get_predictions_and_data( + fuel_name, prop_name + ) + line_color, marker_style = get_line_spec(fuel_name, fuel_index=fuel_idx) + + # Plot predictions + ax[i].plot( + fl.K2C(T_pred), + pred, + "-", + color=line_color, + label=f"FuelLib: {get_legend_label(fuel_name)}", + linewidth=2, + ) + + # Plot experimental data if available + if len(prop_data) > 0: + ax[i].scatter( + T_data, + prop_data, + marker=marker_style, + label=f"Data: {get_legend_label(fuel_name)}", + facecolors=line_color, + s=50, + zorder=5, + ) + + # Format subplot + ax[i].set_xlabel("T [°C]", fontsize=12) + ax[i].set_ylabel(ylab.get(prop_name, prop_name), fontsize=12) + ax[i].tick_params(labelsize=10) + ax[i].grid(alpha=0.3) + + # Add legend + handles, labels = ax[0].get_legend_handles_labels() + fig.legend( + handles, labels, loc="outside lower center", ncol=len(fuel_names), fontsize=10 + ) + + if title: + fig.suptitle(title, fontsize=14, fontweight="bold") + + # Save the plot if requested + if save: + fuel_str = "_".join(fuel_names) + plot_file = os.path.join(output_dir, f"mixture_properties_{fuel_str}.png") + fig.savefig(plot_file, dpi=300, bbox_inches="tight") + print(f"Mixture properties plot saved to {plot_file}") + + # Display the plot if requested + if display: + plt.show() + else: + plt.close(fig) + + +def comp_main(): + """ + Entry point for fl-plt-comp command - Plot fuel composition. + """ + parser = argparse.ArgumentParser( + description="Plot fuel composition by compound and chemical family." + ) + + # Fuel name (required) + parser.add_argument( + "-f", + "--fuel_name", + required=True, + metavar="NAME", + help="Name of the fuel to plot (required).", + ) + parser.add_argument( + "-dir", + "--fuel_data_dir", + default=None, + metavar="PATH", + help="Directory where fuel data files are located (optional).", + ) + parser.add_argument( + "-o", + "--output_dir", + default=None, + metavar="PATH", + help="Directory to save the plot (optional, default: current directory).", + ) + parser.add_argument( + "-t", + "--title", + default=None, + metavar="TITLE", + help="Title for the plots (optional, default: fuel_name, or 'none' to disable).", + ) + parser.add_argument( + "-decomp", + "--decomp_name", + default=None, + metavar="NAME", + help="Name of the decomposition file to use (optional, default: fuel_name).", + ) + parser.add_argument( + "-d", + "--display", + action="store_true", + help="Display the plot with plt.show() (optional, default: False).", + ) + parser.add_argument( + "-s", + "--save", + type=lambda x: str(x).lower() not in ["false", "0"], + default=True, + metavar="{true,false}", + help="Save the plot to a file (optional, default: True).", + ) + + args = parser.parse_args() + + try: + plot_composition( + args.fuel_name, + fuel_data_dir=args.fuel_data_dir, + output_dir=args.output_dir, + title=args.title, + decomp_name=args.decomp_name, + save=args.save, + display=args.display, + ) + except Exception as e: + print(f"Error plotting composition: {e}") + exit(1) + + +def props_main(): + """ + Entry point for fl-plt-props command - Plot mixture properties. + """ + parser = argparse.ArgumentParser( + description="Plot mixture properties over temperature range for fuel(s)." + ) + + parser.add_argument( + "-f", + "--fuel_names", + required=True, + nargs="+", + metavar="NAME", + help="Name(s) of fuel(s) to plot (required, space-separated for multiple).", + ) + parser.add_argument( + "-p", + "--property_names", + nargs="+", + default=None, + metavar="PROP", + help="Properties to plot (optional). Options: Density, Viscosity, VaporPressure, SurfaceTension, ThermalConductivity", + ) + parser.add_argument( + "-dir", + "--fuel_data_dir", + default=None, + metavar="PATH", + help="Directory where fuel data files are located (optional).", + ) + parser.add_argument( + "-o", + "--output_dir", + default=None, + metavar="PATH", + help="Directory to save the plot (optional, default: current directory).", + ) + parser.add_argument( + "-t", + "--title", + default=None, + metavar="TITLE", + help="Title for the plot (optional).", + ) + parser.add_argument( + "-decomp", + "--decomp_name", + default=None, + metavar="NAME", + help="Name of the decomposition file to use (optional, default: fuel_name).", + ) + parser.add_argument( + "-d", + "--display", + action="store_true", + help="Display the plot with plt.show() (optional, default: False).", + ) + parser.add_argument( + "-s", + "--save", + type=lambda x: str(x).lower() not in ["false", "0"], + default=True, + metavar="{true,false}", + help="Save the plot to a file (optional, default: True).", + ) + + args = parser.parse_args() + + try: + plot_mixture_properties( + args.fuel_names, + property_names=args.property_names, + fuel_data_dir=args.fuel_data_dir, + output_dir=args.output_dir, + title=args.title, + decomp_name=args.decomp_name, + save=args.save, + display=args.display, + ) + except Exception as e: + print(f"Error plotting mixture properties: {e}") + exit(1) + + +def main(): + """ + Main entry point for CLI usage. + + This function handles routing between composition and mixture properties plotting. + """ + parser = argparse.ArgumentParser( + description="Plot fuel composition or mixture properties." + ) + + # Subparsers for different plot types + subparsers = parser.add_subparsers(dest="plot_type", help="Type of plot to generate") + + # Composition plotter subcommand + comp_parser = subparsers.add_parser("comp", help="Plot fuel composition") + comp_parser.add_argument( + "-f", + "--fuel_name", + required=True, + metavar="NAME", + help="Name of the fuel to plot (required).", + ) + comp_parser.add_argument( + "-dir", + "--fuel_data_dir", + default=None, + metavar="PATH", + help="Directory where fuel data files are located (optional).", + ) + comp_parser.add_argument( + "-o", + "--output_dir", + default=None, + metavar="PATH", + help="Directory to save the plot (optional, default: current directory).", + ) + comp_parser.add_argument( + "-t", + "--title", + default=None, + metavar="TITLE", + help="Title for the plots (optional, default: fuel_name, or 'none' to disable).", + ) + + # Mixture properties plotter subcommand + props_parser = subparsers.add_parser( + "props", help="Plot mixture properties over temperature range" + ) + props_parser.add_argument( + "-f", + "--fuel_names", + required=True, + nargs="+", + metavar="NAME", + help="Name(s) of fuel(s) to plot (required, space-separated for multiple).", + ) + props_parser.add_argument( + "-p", + "--property_names", + nargs="+", + default=None, + metavar="PROP", + help="Properties to plot (optional). Options: Density, Viscosity, VaporPressure, SurfaceTension, ThermalConductivity", + ) + props_parser.add_argument( + "-dir", + "--fuel_data_dir", + default=None, + metavar="PATH", + help="Directory where fuel data files are located (optional).", + ) + props_parser.add_argument( + "-o", + "--output_dir", + default=None, + metavar="PATH", + help="Directory to save the plot (optional, default: current directory).", + ) + props_parser.add_argument( + "-t", + "--title", + default=None, + metavar="TITLE", + help="Title for the plot (optional).", + ) + + args = parser.parse_args() + + if args.plot_type == "comp": + try: + plot_composition( + args.fuel_name, + fuel_data_dir=args.fuel_data_dir, + output_dir=args.output_dir, + title=args.title, + ) + except Exception as e: + print(f"Error plotting composition: {e}") + exit(1) + + elif args.plot_type == "props": + try: + plot_mixture_properties( + args.fuel_names, + property_names=args.property_names, + fuel_data_dir=args.fuel_data_dir, + output_dir=args.output_dir, + title=args.title, + ) + except Exception as e: + print(f"Error plotting mixture properties: {e}") + exit(1) + + else: + # If no subcommand specified, show help + parser.print_help() + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index 4a769b9..f0744c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ dependencies = [ "numpy>=1.19.0", "pandas>=1.0.0", "scipy>=1.5.0", + "pyyaml>=5.0", "importlib-resources>=5.0; python_version < '3.9'", ] @@ -53,6 +54,9 @@ fl-format = "fuellib.format_code:main" fl-eps2K = "fuellib.utilities.transport_props_converter:eps2K_main" fl-C2K = "fuellib.utilities.temp_converter:c2k_main" fl-K2C = "fuellib.utilities.temp_converter:k2c_main" +fl-plt-comp = "fuellib.utilities.plotting:comp_main" +fl-plt-props = "fuellib.utilities.plotting:props_main" +fl-fuels = "fuellib.utilities.fuel_manager:list_fuels_main" [project.urls] Repository = "https://github.com/NatLabRockies/FuelLib" diff --git a/tests/test_hc_identification.py b/tests/test_hc_identification.py new file mode 100644 index 0000000..6a58f88 --- /dev/null +++ b/tests/test_hc_identification.py @@ -0,0 +1,276 @@ +"""Test hydrocarbon identification: nC, nH, and hc_type determination.""" +import re +from pathlib import Path +import pytest +import pandas as pd +import fuellib as fl + + +def get_available_fuels(): + """Discover available fuels from fuelData/gcData directory.""" + gcdata_dir = Path(__file__).parent.parent / "fuelData" / "gcData" + fuels = sorted([ + f.name.replace('_init.csv', '') + for f in gcdata_dir.glob('*_init.csv') + ]) + return fuels + + +def extract_c_h_from_formula(formula): + """Extract carbon and hydrogen counts from formula string (e.g., C7H8 -> (7, 8)).""" + if not formula or pd.isna(formula): + return None, None + + formula = str(formula).strip() + # Match CnHm pattern + match = re.match(r'C(\d+)H(\d+)', formula) + if match: + return int(match.group(1)), int(match.group(2)) + return None, None + + +def infer_hc_type_from_formula(formula, compound_name=""): + """Infer expected hydrocarbon type from formula.""" + if not formula or pd.isna(formula): + return None + + nc, nh = extract_c_h_from_formula(formula) + if nc is None: + return None + + # Check for aromatic patterns (diaromatics, cycloaromatics, benzenes) + if "Diaromatic" in compound_name or "aromatic" in compound_name.lower(): + return "aromatic" + if "Benzene" in compound_name or "Toluene" in compound_name: + return "aromatic" + + # Check for alkene patterns + if "Alkene" in compound_name: + return "alkene" + + # Check for cycloalkane patterns + if "Cycloparaffin" in compound_name or "Cycloaromatic" in compound_name: + # These have aromatic rings attached, classified as aromatic + if "Cycloaromatic" in compound_name: + return "aromatic" + return "cyclo-alkane" + + # For alkanes, check saturation + # Alkanes: CnH(2n+2) + if nh == 2 * nc + 2: + # Check if it's iso or n based on name + if "Isoparaffin" in compound_name or "iso" in compound_name.lower(): + return "iso-alkane" + elif "n-C" in compound_name or compound_name.startswith("n-"): + return "n-alkane" + else: + # Default branched alkanes to iso-alkane + return "iso-alkane" + + # Monocycloalkanes: CnH(2n) + if "Monocyclo" in compound_name and nh == 2 * nc: + return "cyclo-alkane" + + # Dicycloalkanes: CnH(2n-2) + if "Dicyclo" in compound_name and nh == 2 * nc - 2: + return "cyclo-alkane" + + # Tricycloalkanes: CnH(2n-4) + if "Tricyclo" in compound_name and nh == 2 * nc - 4: + return "cyclo-alkane" + + return None + + +class TestHCIdentification: + """Test suite for hydrocarbon type, carbon, and hydrogen identification.""" + + @pytest.mark.parametrize("fuel_name", get_available_fuels()) + def test_hc_identification(self, fuel_name): + """Comprehensive test for HC identification: nC, nH, hc_type, and compound classification.""" + # Load fuel + fuel = fl.fuel(fuel_name) + + print(f"\n{'='*60}") + print(f"Fuel: {fuel_name}") + print(f"{'='*60}") + print(f"Compounds: {fuel.num_compounds}") + + # === Test 1: nC matches reference formula === + mismatches = [] + for compound, formula, nc_calc in zip(fuel.compounds, fuel.formulas, fuel.nC): + if not formula or pd.isna(formula): + continue + + nc_ref, _ = extract_c_h_from_formula(formula) + + if nc_ref is not None: + tolerance = 2.0 if "Cycloaromatic" in compound else 0.1 + + if abs(nc_calc - nc_ref) > tolerance: + mismatches.append( + f"{compound}: calculated nC={nc_calc:.1f}, expected nC={nc_ref}" + ) + + assert not mismatches, ( + f"Carbon count mismatches:\n" + "\n".join(mismatches) + ) + print(f"✓ nC from decomp matches reference formula") + + # === Test 2: nH matches reference formula === + mismatches = [] + for compound, formula, nh_calc in zip(fuel.compounds, fuel.formulas, fuel.nH): + if not formula or pd.isna(formula): + continue + + _, nh_ref = extract_c_h_from_formula(formula) + + if nh_ref is not None: + tolerance = 2.0 if "Cycloaromatic" in compound else 0.1 + + if abs(nh_calc - nh_ref) > tolerance: + mismatches.append( + f"{compound}: calculated nH={nh_calc:.1f}, expected nH={nh_ref}" + ) + + assert not mismatches, ( + f"Hydrogen count mismatches:\n" + "\n".join(mismatches) + ) + print(f"✓ nH from decomp matches reference formula") + + # === Test 3: hc_type is consistent === + valid_types = {"n-alkane", "iso-alkane", "cyclo-alkane", "alkene", "aromatic"} + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if hc_type not in valid_types: + mismatches.append( + f"{compound}: invalid hc_type='{hc_type}' " + f"(must be one of {valid_types})" + ) + + assert not mismatches, ( + f"Invalid hydrocarbon types:\n" + "\n".join(mismatches) + ) + print(f"✓ hc_type from decomp is consistent") + + # === Test 4: hc_type matches formula-derived expectations === + mismatches = [] + for compound, formula, hc_type_calc in zip(fuel.compounds, fuel.formulas, fuel.hc_type): + if not formula or pd.isna(formula): + continue + + hc_type_expected = infer_hc_type_from_formula(formula, compound) + + if hc_type_expected is not None: + if hc_type_calc != hc_type_expected: + mismatches.append( + f"{compound}: calculated hc_type='{hc_type_calc}', " + f"expected hc_type='{hc_type_expected}' " + f"(formula: {formula})" + ) + + assert not mismatches, ( + f"Hydrocarbon type mismatches:\n" + "\n".join(mismatches) + ) + print(f"✓ hc_type from decomp matches formula-derived expectations") + + # === Test 5: Aromatic compounds identified === + aromatic_names = { + compound for compound, formula in zip(fuel.compounds, fuel.formulas) + if formula and ("Benzene" in compound or "aromatic" in compound.lower() or "naphthalene" in formula.lower()) + } + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if compound in aromatic_names: + if hc_type != "aromatic": + mismatches.append( + f"{compound}: should be aromatic but got '{hc_type}'" + ) + + assert not mismatches, ( + f"Aromatic compounds not correctly identified:\n" + "\n".join(mismatches) + ) + aromatic_count = len(aromatic_names) if aromatic_names else 0 + print(f"✓ aromatic compounds identified correctly ({aromatic_count} found)") + + # === Test 6: n-alkane compounds identified === + nalkane_names = { + compound for compound in fuel.compounds + if compound.startswith("n-C") + } + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if compound in nalkane_names: + if hc_type != "n-alkane": + mismatches.append( + f"{compound}: should be n-alkane but got '{hc_type}'" + ) + + assert not mismatches, ( + f"n-alkane compounds not correctly identified:\n" + "\n".join(mismatches) + ) + nalkane_count = len(nalkane_names) if nalkane_names else 0 + print(f"✓ n-alkane compounds identified correctly ({nalkane_count} found)") + + # === Test 7: Cycloalkane compounds identified === + cyclo_names = { + compound for compound in fuel.compounds + if "cycloparaffin" in compound.lower() and "aromatic" not in compound.lower() + } + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if compound in cyclo_names: + if hc_type != "cyclo-alkane": + mismatches.append( + f"{compound}: should be cyclo-alkane but got '{hc_type}'" + ) + + assert not mismatches, ( + f"Cycloalkane compounds not correctly identified:\n" + "\n".join(mismatches) + ) + cyclo_count = len(cyclo_names) if cyclo_names else 0 + print(f"✓ cyclo-alkane compounds identified correctly ({cyclo_count} found)") + + # === Test 7b: iso-alkane compounds identified === + isoalkane_names = { + compound for compound in fuel.compounds + if "Isoparaffin" in compound + } + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if compound in isoalkane_names: + if hc_type != "iso-alkane": + mismatches.append( + f"{compound}: should be iso-alkane but got '{hc_type}'" + ) + + assert not mismatches, ( + f"iso-alkane compounds not correctly identified:\n" + "\n".join(mismatches) + ) + isoalkane_count = len(isoalkane_names) if isoalkane_names else 0 + print(f"✓ iso-alkane compounds identified correctly ({isoalkane_count} found)") + + # === Test 8: Alkene compounds identified === + alkene_names = { + compound for compound in fuel.compounds + if "Alkene" in compound + } + + mismatches = [] + for compound, hc_type in zip(fuel.compounds, fuel.hc_type): + if compound in alkene_names: + if hc_type != "alkene": + mismatches.append( + f"{compound}: should be alkene but got '{hc_type}'" + ) + + assert not mismatches, ( + f"Alkene compounds not correctly identified:\n" + "\n".join(mismatches) + ) + alkene_count = len(alkene_names) if alkene_names else 0 + print(f"✓ alkene compounds identified correctly ({alkene_count} found)") diff --git a/tutorials/compositionPlots.py b/tutorials/compositionPlots.py index 1d2d831..ac41ecd 100644 --- a/tutorials/compositionPlots.py +++ b/tutorials/compositionPlots.py @@ -9,82 +9,57 @@ fuel = fl.fuel(fuel_name) -# Classify compounds into families -aromatic = [ - True if re.search(r"Toluene|Benzene|Aromatic", comp, re.IGNORECASE) else False - for comp in fuel.compounds -] -n_alkane = [ - True if re.search(r"n-C", comp, re.IGNORECASE) else False for comp in fuel.compounds -] -isoalkane = [ - True if re.search(r"Isoparaffin", comp, re.IGNORECASE) else False - for comp in fuel.compounds -] -cycloalkane = [ - True if re.search(r"Cycloparaffin", comp, re.IGNORECASE) else False - for comp in fuel.compounds -] - # Create a DataFrame with the compounds and their families -colNames = ["Compound", "Weight %"] -df = pd.DataFrame({"Compounds": fuel.compounds, "Weight %": fuel.Y_0 * 100}) -# Append classification as a new column +# Use the hydrocarbon type classification from group decompositions family_names = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic"] -df["Family"] = np.select( - [n_alkane, isoalkane, cycloalkane, aromatic], family_names, default="unknown" -) +df = pd.DataFrame({ + "Compound": fuel.compounds, + "Weight %": fuel.Y_0 * 100, + "Family": fuel.hc_type, +}) - -# Determine carbon number by row: +# Determine carbon number from compound name def determine_carbon_number(compound): + """Extract carbon number from compound name.""" if "Toluene" in compound: return 7 elif "benzene" in compound.lower(): - # Extract the number after "C" and add 7 match = re.search(r"C(\d+)", compound) if match: try: - carbon_number = int(match.group(1)) - return carbon_number + 6 + return int(match.group(1)) + 6 except ValueError: - return np.nan # Handle cases where extraction fails - else: - return np.nan # No match found + return np.nan + return np.nan else: - # Extract the number after "C" in either format match = re.search(r"C(\d+)", compound) if match: try: return int(match.group(1)) except ValueError: - return np.nan # Handle cases where extraction fails - else: - return np.nan # No match found + return np.nan + return np.nan +df["nC"] = df["Compound"].apply(determine_carbon_number) -# Apply the function to the column and append as a new column -df["nC"] = df.Compounds.apply(determine_carbon_number) +# Remove rows with weight % <= 0.01 +df = df[df["Weight %"] > 0.01] -# Determine relative weight % of each family +# Calculate family weights family_weights = df.groupby("Family")["Weight %"].sum() -# Print the sum of weight % for each family -print("\n" + "=" * 45) +# Print composition table +print(f"\n{'=' * 50}") print("Relative Weight % of Each Compound Family") print(f"Fuel: {fuel_name}") -print("=" * 45) +print("=" * 50) for family, weight in family_weights.items(): print(f" {family:<20} {weight:>8.2f}%") -print("-" * 45) +print("-" * 50) print(f" {'Total':<20} {family_weights.sum():>8.2f}%") -print("=" * 45 + "\n") - -# Remove rows <= 0.01 in weight % column at max(nC) -df = df[df["Weight %"] > 0.01] +print("=" * 50 + "\n") -# Plotting parameters -spacing = [-0.2985, -0.099, 0.099, 0.2985] +# Color scheme colors = { "n-alkane": "#063C61", "iso-alkane": "#2980B9", @@ -92,60 +67,99 @@ def determine_carbon_number(compound): "aromatic": "#7f7f7f", } -# Bar plot of the number of compounds in each family -plt.figure(figsize=(7, 5)) +# Create figure with two subplots side by side +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), constrained_layout=True) + +# Plot 1: Bar chart grouped by carbon number +spacing = [-0.2985, -0.099, 0.099, 0.2985] N = df.nC.unique() families_in_data = df["Family"].unique() + for k, family in enumerate(family_names): if family not in families_in_data: - # Only plot families that actually exist in the data continue - nC = df[df["Family"] == family].nC - weight = df[df["Family"] == family]["Weight %"] + df_family = df[df["Family"] == family] + nC = df_family.nC + weight = df_family["Weight %"] - # check duplicate nC values + # Check for duplicate carbon numbers and sum weights if len(nC) != len(set(nC)): - # If there are duplicates, sum the weights for each nC - df_grouped = ( - df[df["Family"] == family].groupby("nC")["Weight %"].sum().reset_index() - ) + df_grouped = df_family.groupby("nC")["Weight %"].sum().reset_index() nC = df_grouped["nC"] weight = df_grouped["Weight %"] - plt.bar( - nC + spacing[k], weight, label=family, alpha=1, color=colors[family], width=0.2 + + ax1.bar( + nC + spacing[k], + weight, + label=family, + alpha=1, + color=colors.get(family, "#7f7f7f"), + width=0.2, ) - plt.xticks(df.nC.unique(), fontsize=14) - plt.xlim(min(N) - 0.5, max(N) + 0.5) - -plt.xlabel("Carbon Number", fontsize=16) -plt.xticks(df.nC.unique(), fontsize=14) -plt.yticks(fontsize=14) -plt.ylabel("Weight %", fontsize=16) -plt.title("Fuel Composition", fontsize=16, fontweight="bold") -plt.legend(fontsize=14) -plt.tight_layout() - -# Plot pie chart of family weights -family_names = family_weights.index.tolist() -plt.figure(figsize=(7, 5)) -plt.pie( - family_weights, + +ax1.set_xlabel("Carbon Number", fontsize=16) +ax1.set_xticks(sorted(N)) +ax1.set_xticklabels(sorted(N), fontsize=14) +ax1.set_xlim(min(N) - 0.5, max(N) + 0.5) +ax1.set_ylabel("Weight %", fontsize=16) +ax1.tick_params(axis="y", labelsize=14) +ax1.grid(axis="y", alpha=0.3) +ax1.legend(fontsize=12, loc="upper left") + +# Plot 2: Pie chart of family composition +# Only include families that have weight > 0 +families_present = [f for f in family_names if f in family_weights.index and family_weights[f] > 0] +family_weights_sorted = family_weights[families_present] + +# Create pie chart without labels/percentages (we'll add them outside) +wedges, texts = ax2.pie( + family_weights_sorted, labels=None, - autopct="%1.1f%%", + autopct=None, startangle=140, - colors=[colors[family] for family in family_names], - textprops={"fontsize": 16, "weight": "bold", "color": "white"}, + colors=[colors.get(family, "#7f7f7f") for family in family_weights_sorted.index], ) + +# Add percentages outside the pie with arrows +for wedge, value, family in zip(wedges, family_weights_sorted.values, family_weights_sorted.index): + angle = (wedge.theta2 + wedge.theta1) / 2 + radius = 1.3 + x = radius * np.cos(np.radians(angle)) + y = radius * np.sin(np.radians(angle)) + + # Determine horizontal alignment based on position + ha = "left" if x > 0 else "right" + + # Add annotation with arrow + ax2.annotate( + f"{value:.1f}%", + xy=(np.cos(np.radians(angle)), np.sin(np.radians(angle))), + xytext=(x, y), + ha=ha, + va="center", + fontsize=14, + fontweight="bold", + arrowprops=dict(arrowstyle="-", color="black", lw=1.5), + ) + +ax2.axis("equal") + +# Add a single figure-level legend for all families legend_handles = [ - plt.Rectangle((0, 0), 1, 1, fc=colors[family]) for family in family_names + plt.Rectangle((0, 0), 1, 1, fc=colors.get(family, "#7f7f7f")) + for family in family_weights_sorted.index ] -plt.legend( +fig.legend( legend_handles, - family_names, - loc="center left", - bbox_to_anchor=(1, 0.5), - fontsize=14, + family_weights_sorted.index, + loc="upper center", + bbox_to_anchor=(0.5, -0.02), + ncol=4, + fontsize=13, + frameon=True, ) -plt.axis("equal") -plt.tight_layout() + +fig.suptitle("Fuel Composition", fontsize=16, fontweight="bold") + plt.show() + From 86d83bfb0a6a94c40d392b85e121cc3d2fe30310 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 08:34:20 -0600 Subject: [PATCH 24/48] Format --- fuellib/__init__.py | 24 ++--- fuellib/_data_locator.py | 43 ++++---- fuellib/utilities/fuel_manager.py | 36 +++---- fuellib/utilities/plotting.py | 77 +++++++++---- tests/test_hc_identification.py | 173 +++++++++++++++--------------- tutorials/compositionPlots.py | 27 +++-- 6 files changed, 205 insertions(+), 175 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index fb16ca6..74fd596 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -110,11 +110,11 @@ def __init__(self, name, decompName=None, fuelDataDir=None): # 2: cycloparaffins # 3: olefins self.fam = np.zeros(self.num_compounds, dtype=int) - + # Classify hydrocarbon by type (n-alkane, iso-alkane, cyclo-alkane, aromatic) # Based on group decompositions from Constantinou-Gani method - self.hc_type = np.array([''] * self.num_compounds, dtype=object) - + self.hc_type = np.array([""] * self.num_compounds, dtype=object) + aromatics = 10 # starting index for aromatic groups num_aromatics = 5 branching = 78 # starting index for branching groups (Group j (CH3)2CH through C(CH3)2C(CH3)2) @@ -123,26 +123,26 @@ def __init__(self, name, decompName=None, fuelDataDir=None): num_cyclos = 5 olefins = 4 # starting index for double bound groups num_olefins = 6 - + for i in range(self.num_compounds): # Check if aromatic: does it contain AC's? if sum(self.Nij[i, aromatics : aromatics + num_aromatics]) > 0: self.fam[i] = 1 - self.hc_type[i] = 'aromatic' + self.hc_type[i] = "aromatic" # Check if cycloparaffin: does it contain rings? elif sum(self.Nij[i, cyclos : cyclos + num_cyclos]) > 0: self.fam[i] = 2 - self.hc_type[i] = 'cyclo-alkane' + self.hc_type[i] = "cyclo-alkane" # Check if olefin: does it contain double bonds? elif sum(self.Nij[i, olefins : olefins + num_olefins]) > 0: self.fam[i] = 3 - self.hc_type[i] = 'alkene' + self.hc_type[i] = "alkene" # Check for branching groups (CH, C quaternary carbons) elif sum(self.Nij[i, branching : branching + num_branching]) > 0: - self.hc_type[i] = 'iso-alkane' + self.hc_type[i] = "iso-alkane" else: # Only CH3 and CH2 -> n-alkane (linear) - self.hc_type[i] = 'n-alkane' + self.hc_type[i] = "n-alkane" # Calculate carbon and hydrogen numbers from first-order group decomposition # For jet fuels, use only alkyl (0-3) and aromatic (10-14) groups @@ -175,16 +175,16 @@ def __init__(self, name, decompName=None, fuelDataDir=None): self.compounds = [ compound.strip() for compound in df_gcxgc["Compound"].to_list() ] - + # Load molecular formulas if available if "Formula" in df_gcxgc.columns: self.formulas = [ - formula.strip() if pd.notna(formula) else None + formula.strip() if pd.notna(formula) else None for formula in df_gcxgc["Formula"].to_list() ] else: self.formulas = None - + if "PelePhysics Key" in df_gcxgc.columns: self.pelephysics_keys = [ key.strip() for key in df_gcxgc["PelePhysics Key"].to_list() diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index 13b5eef..c532f0e 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -15,6 +15,7 @@ try: import yaml + HAS_YAML = True except ImportError: HAS_YAML = False @@ -85,7 +86,7 @@ def get_fueldata_props_dir(): def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): """ Load decomposition name mapping from fuel_metadata.yaml. - + :param fuel_name: Name of the fuel to look up. :type fuel_name: str :param fuel_data_dir: Directory containing fuel data. If None, uses embedded data. @@ -98,22 +99,16 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): raise ImportError( "PyYAML is required to use custom fuels. Install it with: pip install pyyaml" ) - + if fuel_data_dir is None: # Use embedded data - metadata_file = os.path.join( - get_fueldata_dir(), - "fuel_metadata.yaml" - ) + metadata_file = os.path.join(get_fueldata_dir(), "fuel_metadata.yaml") data_dir_display = "FuelLib embedded data" else: # Use custom data directory - metadata_file = os.path.join( - fuel_data_dir, - "fuel_metadata.yaml" - ) + metadata_file = os.path.join(fuel_data_dir, "fuel_metadata.yaml") data_dir_display = fuel_data_dir - + if not os.path.exists(metadata_file): raise FileNotFoundError( f"fuel_metadata.yaml not found in {data_dir_display}.\n\n" @@ -125,17 +120,17 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): f" decomp_name: {fuel_name} # or name of your .csv file in groupDecompositionData/\n\n" f"See the 'Adding Custom Fuels' documentation for more details." ) - + try: - with open(metadata_file, 'r') as f: + with open(metadata_file, "r") as f: data = yaml.safe_load(f) except Exception as e: raise ValueError( f"Error parsing {metadata_file}:\n{e}\n\n" f"Make sure the file is valid YAML with proper indentation." ) - - if not data or 'fuels' not in data: + + if not data or "fuels" not in data: raise ValueError( f"Invalid metadata file {metadata_file}.\n" f"File must contain a 'fuels' section.\n\n" @@ -144,9 +139,9 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): f" {fuel_name}:\n" f" decomp_name: {fuel_name}" ) - - if fuel_name not in data['fuels']: - available = list(data['fuels'].keys()) + + if fuel_name not in data["fuels"]: + available = list(data["fuels"].keys()) raise KeyError( f"Fuel '{fuel_name}' not found in {metadata_file}.\n\n" f"Available fuels: {', '.join(available) if available else 'none'}\n\n" @@ -155,10 +150,10 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): f" {fuel_name}:\n" f" decomp_name: {fuel_name}" ) - - fuel_meta = data['fuels'][fuel_name] - - if 'decomp_name' not in fuel_meta: + + fuel_meta = data["fuels"][fuel_name] + + if "decomp_name" not in fuel_meta: raise ValueError( f"Incomplete metadata for fuel '{fuel_name}' in {metadata_file}.\n\n" f"Required fields:\n" @@ -166,5 +161,5 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): f"Current entry:\n" f" {fuel_name}: {fuel_meta}" ) - - return fuel_meta['decomp_name'] + + return fuel_meta["decomp_name"] diff --git a/fuellib/utilities/fuel_manager.py b/fuellib/utilities/fuel_manager.py index b6369c5..e0168e9 100644 --- a/fuellib/utilities/fuel_manager.py +++ b/fuellib/utilities/fuel_manager.py @@ -11,6 +11,7 @@ try: import yaml + HAS_YAML = True except ImportError: HAS_YAML = False @@ -19,7 +20,7 @@ def load_fuel_metadata(fuel_data_dir=None): """ Load fuel metadata from YAML file if available. - + :param fuel_data_dir: Optional directory containing fuel data (e.g., customFuels/fuelData). If None, loads from embedded FuelLib data. :type fuel_data_dir: str, optional @@ -28,26 +29,23 @@ def load_fuel_metadata(fuel_data_dir=None): """ if not HAS_YAML: return {} - + # Determine which metadata file to load if fuel_data_dir is None: # Load from embedded data - metadata_file = os.path.join( - fl.get_fueldata_dir(), - "fuel_metadata.yaml" - ) + metadata_file = os.path.join(fl.get_fueldata_dir(), "fuel_metadata.yaml") else: # Load from custom directory metadata_file = os.path.join(fuel_data_dir, "fuel_metadata.yaml") - + try: if os.path.exists(metadata_file): - with open(metadata_file, 'r') as f: + with open(metadata_file, "r") as f: data = yaml.safe_load(f) - return data.get('fuels', {}) if data else {} + return data.get("fuels", {}) if data else {} except Exception as e: pass - + return {} @@ -105,15 +103,15 @@ def list_fuels_main(): else: print("Available Fuels in FuelLib") print("=" * 80) - + if args.verbose and metadata: # Verbose output with metadata for i, fuel_name in enumerate(fuel_names, 1): meta = metadata.get(fuel_name, {}) - category = meta.get('category', 'Unknown') - source = meta.get('source') - description = meta.get('description', '') - + category = meta.get("category", "Unknown") + source = meta.get("source") + description = meta.get("description", "") + print(f"{i:2d}. {fuel_name}") print(f" Category: {category}") if source: @@ -125,18 +123,20 @@ def list_fuels_main(): # Simple list output for i, fuel_name in enumerate(fuel_names, 1): if metadata and fuel_name in metadata: - source = metadata[fuel_name].get('source', '') + source = metadata[fuel_name].get("source", "") if source: print(f"{i:2d}. {fuel_name:<20} [{source}]") else: print(f"{i:2d}. {fuel_name}") else: print(f"{i:2d}. {fuel_name}") - + print("=" * 80) print(f"Total: {len(fuel_names)} fuel(s)") if not args.verbose and metadata: - print("Use -v/--verbose for detailed information including source and category") + print( + "Use -v/--verbose for detailed information including source and category" + ) print("=" * 80 + "\n") except Exception as e: diff --git a/fuellib/utilities/plotting.py b/fuellib/utilities/plotting.py index 83fb928..231174f 100644 --- a/fuellib/utilities/plotting.py +++ b/fuellib/utilities/plotting.py @@ -15,7 +15,15 @@ import fuellib as fl -def plot_composition(fuel_name, fuel_data_dir=None, output_dir=None, title=None, decomp_name=None, save=True, display=False): +def plot_composition( + fuel_name, + fuel_data_dir=None, + output_dir=None, + title=None, + decomp_name=None, + save=True, + display=False, +): """ Plot the composition of a given fuel. @@ -55,11 +63,13 @@ def plot_composition(fuel_name, fuel_data_dir=None, output_dir=None, title=None, # Create DataFrame with compound data family_names = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic"] - df = pd.DataFrame({ - "Compound": fuel.compounds, - "Weight %": fuel.Y_0 * 100, - "Family": fuel.hc_type, - }) + df = pd.DataFrame( + { + "Compound": fuel.compounds, + "Weight %": fuel.Y_0 * 100, + "Family": fuel.hc_type, + } + ) # Determine carbon number from compound name def determine_carbon_number(compound): @@ -84,7 +94,7 @@ def determine_carbon_number(compound): return np.nan df["nC"] = df["Compound"].apply(determine_carbon_number) - + # Remove rows with weight % <= 0.01 df = df[df["Weight %"] > 0.01] @@ -152,7 +162,9 @@ def determine_carbon_number(compound): # Plot 2: Pie chart of family composition # Only include families that have weight > 0 - families_present = [f for f in family_names if f in family_weights.index and family_weights[f] > 0] + families_present = [ + f for f in family_names if f in family_weights.index and family_weights[f] > 0 + ] family_weights_sorted = family_weights[families_present] # Create pie chart without labels/percentages (we'll add them outside) @@ -161,19 +173,23 @@ def determine_carbon_number(compound): labels=None, autopct=None, startangle=140, - colors=[colors.get(family, "#7f7f7f") for family in family_weights_sorted.index], + colors=[ + colors.get(family, "#7f7f7f") for family in family_weights_sorted.index + ], ) # Add percentages outside the pie with arrows - for wedge, value, family in zip(wedges, family_weights_sorted.values, family_weights_sorted.index): + for wedge, value, family in zip( + wedges, family_weights_sorted.values, family_weights_sorted.index + ): angle = (wedge.theta2 + wedge.theta1) / 2 radius = 1.3 x = radius * np.cos(np.radians(angle)) y = radius * np.sin(np.radians(angle)) - + # Determine horizontal alignment based on position ha = "left" if x > 0 else "right" - + # Add annotation with arrow ax2.annotate( f"{value:.1f}%", @@ -221,7 +237,14 @@ def determine_carbon_number(compound): def plot_mixture_properties( - fuel_names, property_names=None, fuel_data_dir=None, output_dir=None, title=None, decomp_name=None, save=True, display=False + fuel_names, + property_names=None, + fuel_data_dir=None, + output_dir=None, + title=None, + decomp_name=None, + save=True, + display=False, ): """ Plot mixture properties for fuel(s) over a temperature range. @@ -325,7 +348,7 @@ def plot_mixture_properties( def get_line_spec(fuel_name, fuel_index=0): """Get line color and marker style for fuel. - + :param fuel_name: Name of the fuel :param fuel_index: Index of fuel in the plot (for cycling through colors) :return: Tuple of (color, marker_style) @@ -336,7 +359,7 @@ def get_line_spec(fuel_name, fuel_index=0): if key in fuel_name.lower(): marker_style = spec[0] break - + # Get color from palette using fuel index color = color_palette[fuel_index % len(color_palette)] return (color, marker_style) @@ -352,7 +375,9 @@ def get_legend_label(fuel_name): def get_temp_range(prop_name): """Get default temperature range for a property.""" - return default_ranges_by_property.get(prop_name, [0, 100]) # Fallback to [0, 100] + return default_ranges_by_property.get( + prop_name, [0, 100] + ) # Fallback to [0, 100] def get_predictions_and_data(fuel_name, prop_name): """Get predicted and experimental data for a property.""" @@ -391,11 +416,17 @@ def get_predictions_and_data(fuel_name, prop_name): for i, T in enumerate(T_pred): try: if prop_name == "Density": - pred[i] = fuel.mixture_density(Y_li, T) * 1.0e-03 # Convert to g/cm^3 + pred[i] = ( + fuel.mixture_density(Y_li, T) * 1.0e-03 + ) # Convert to g/cm^3 elif prop_name == "VaporPressure": - pred[i] = fuel.mixture_vapor_pressure(Y_li, T) * 1.0e-03 # Convert to kPa + pred[i] = ( + fuel.mixture_vapor_pressure(Y_li, T) * 1.0e-03 + ) # Convert to kPa elif prop_name == "Viscosity": - pred[i] = fuel.mixture_kinematic_viscosity(Y_li, T) * 1.0e6 # Convert to mm^2/s + pred[i] = ( + fuel.mixture_kinematic_viscosity(Y_li, T) * 1.0e6 + ) # Convert to mm^2/s elif prop_name == "SurfaceTension": pred[i] = fuel.mixture_surface_tension(Y_li, T) elif prop_name == "ThermalConductivity": @@ -408,9 +439,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Create figure with subplots n_props = len(property_names) figW = 4.25 * n_props - fig, ax = plt.subplots( - 1, n_props, figsize=(figW, 5.5), constrained_layout=True - ) + fig, ax = plt.subplots(1, n_props, figsize=(figW, 5.5), constrained_layout=True) # Handle single subplot case if n_props == 1: @@ -647,7 +676,9 @@ def main(): ) # Subparsers for different plot types - subparsers = parser.add_subparsers(dest="plot_type", help="Type of plot to generate") + subparsers = parser.add_subparsers( + dest="plot_type", help="Type of plot to generate" + ) # Composition plotter subcommand comp_parser = subparsers.add_parser("comp", help="Plot fuel composition") diff --git a/tests/test_hc_identification.py b/tests/test_hc_identification.py index 6a58f88..d4693a9 100644 --- a/tests/test_hc_identification.py +++ b/tests/test_hc_identification.py @@ -1,4 +1,5 @@ """Test hydrocarbon identification: nC, nH, and hc_type determination.""" + import re from pathlib import Path import pytest @@ -9,10 +10,9 @@ def get_available_fuels(): """Discover available fuels from fuelData/gcData directory.""" gcdata_dir = Path(__file__).parent.parent / "fuelData" / "gcData" - fuels = sorted([ - f.name.replace('_init.csv', '') - for f in gcdata_dir.glob('*_init.csv') - ]) + fuels = sorted( + [f.name.replace("_init.csv", "") for f in gcdata_dir.glob("*_init.csv")] + ) return fuels @@ -20,10 +20,10 @@ def extract_c_h_from_formula(formula): """Extract carbon and hydrogen counts from formula string (e.g., C7H8 -> (7, 8)).""" if not formula or pd.isna(formula): return None, None - + formula = str(formula).strip() # Match CnHm pattern - match = re.match(r'C(\d+)H(\d+)', formula) + match = re.match(r"C(\d+)H(\d+)", formula) if match: return int(match.group(1)), int(match.group(2)) return None, None @@ -33,28 +33,28 @@ def infer_hc_type_from_formula(formula, compound_name=""): """Infer expected hydrocarbon type from formula.""" if not formula or pd.isna(formula): return None - + nc, nh = extract_c_h_from_formula(formula) if nc is None: return None - + # Check for aromatic patterns (diaromatics, cycloaromatics, benzenes) if "Diaromatic" in compound_name or "aromatic" in compound_name.lower(): return "aromatic" if "Benzene" in compound_name or "Toluene" in compound_name: return "aromatic" - + # Check for alkene patterns if "Alkene" in compound_name: return "alkene" - + # Check for cycloalkane patterns if "Cycloparaffin" in compound_name or "Cycloaromatic" in compound_name: # These have aromatic rings attached, classified as aromatic if "Cycloaromatic" in compound_name: return "aromatic" return "cyclo-alkane" - + # For alkanes, check saturation # Alkanes: CnH(2n+2) if nh == 2 * nc + 2: @@ -66,19 +66,19 @@ def infer_hc_type_from_formula(formula, compound_name=""): else: # Default branched alkanes to iso-alkane return "iso-alkane" - + # Monocycloalkanes: CnH(2n) if "Monocyclo" in compound_name and nh == 2 * nc: return "cyclo-alkane" - + # Dicycloalkanes: CnH(2n-2) if "Dicyclo" in compound_name and nh == 2 * nc - 2: return "cyclo-alkane" - + # Tricycloalkanes: CnH(2n-4) if "Tricyclo" in compound_name and nh == 2 * nc - 4: return "cyclo-alkane" - + return None @@ -90,57 +90,53 @@ def test_hc_identification(self, fuel_name): """Comprehensive test for HC identification: nC, nH, hc_type, and compound classification.""" # Load fuel fuel = fl.fuel(fuel_name) - + print(f"\n{'='*60}") print(f"Fuel: {fuel_name}") print(f"{'='*60}") print(f"Compounds: {fuel.num_compounds}") - + # === Test 1: nC matches reference formula === mismatches = [] for compound, formula, nc_calc in zip(fuel.compounds, fuel.formulas, fuel.nC): if not formula or pd.isna(formula): continue - + nc_ref, _ = extract_c_h_from_formula(formula) - + if nc_ref is not None: tolerance = 2.0 if "Cycloaromatic" in compound else 0.1 - + if abs(nc_calc - nc_ref) > tolerance: mismatches.append( f"{compound}: calculated nC={nc_calc:.1f}, expected nC={nc_ref}" ) - - assert not mismatches, ( - f"Carbon count mismatches:\n" + "\n".join(mismatches) - ) + + assert not mismatches, f"Carbon count mismatches:\n" + "\n".join(mismatches) print(f"✓ nC from decomp matches reference formula") - + # === Test 2: nH matches reference formula === mismatches = [] for compound, formula, nh_calc in zip(fuel.compounds, fuel.formulas, fuel.nH): if not formula or pd.isna(formula): continue - + _, nh_ref = extract_c_h_from_formula(formula) - + if nh_ref is not None: tolerance = 2.0 if "Cycloaromatic" in compound else 0.1 - + if abs(nh_calc - nh_ref) > tolerance: mismatches.append( f"{compound}: calculated nH={nh_calc:.1f}, expected nH={nh_ref}" ) - - assert not mismatches, ( - f"Hydrogen count mismatches:\n" + "\n".join(mismatches) - ) + + assert not mismatches, f"Hydrogen count mismatches:\n" + "\n".join(mismatches) print(f"✓ nH from decomp matches reference formula") - + # === Test 3: hc_type is consistent === valid_types = {"n-alkane", "iso-alkane", "cyclo-alkane", "alkene", "aromatic"} - + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if hc_type not in valid_types: @@ -148,20 +144,20 @@ def test_hc_identification(self, fuel_name): f"{compound}: invalid hc_type='{hc_type}' " f"(must be one of {valid_types})" ) - - assert not mismatches, ( - f"Invalid hydrocarbon types:\n" + "\n".join(mismatches) - ) + + assert not mismatches, f"Invalid hydrocarbon types:\n" + "\n".join(mismatches) print(f"✓ hc_type from decomp is consistent") - + # === Test 4: hc_type matches formula-derived expectations === mismatches = [] - for compound, formula, hc_type_calc in zip(fuel.compounds, fuel.formulas, fuel.hc_type): + for compound, formula, hc_type_calc in zip( + fuel.compounds, fuel.formulas, fuel.hc_type + ): if not formula or pd.isna(formula): continue - + hc_type_expected = infer_hc_type_from_formula(formula, compound) - + if hc_type_expected is not None: if hc_type_calc != hc_type_expected: mismatches.append( @@ -169,18 +165,22 @@ def test_hc_identification(self, fuel_name): f"expected hc_type='{hc_type_expected}' " f"(formula: {formula})" ) - - assert not mismatches, ( - f"Hydrocarbon type mismatches:\n" + "\n".join(mismatches) - ) + + assert not mismatches, f"Hydrocarbon type mismatches:\n" + "\n".join(mismatches) print(f"✓ hc_type from decomp matches formula-derived expectations") - + # === Test 5: Aromatic compounds identified === aromatic_names = { - compound for compound, formula in zip(fuel.compounds, fuel.formulas) - if formula and ("Benzene" in compound or "aromatic" in compound.lower() or "naphthalene" in formula.lower()) + compound + for compound, formula in zip(fuel.compounds, fuel.formulas) + if formula + and ( + "Benzene" in compound + or "aromatic" in compound.lower() + or "naphthalene" in formula.lower() + ) } - + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if compound in aromatic_names: @@ -188,19 +188,18 @@ def test_hc_identification(self, fuel_name): mismatches.append( f"{compound}: should be aromatic but got '{hc_type}'" ) - - assert not mismatches, ( - f"Aromatic compounds not correctly identified:\n" + "\n".join(mismatches) - ) + + assert ( + not mismatches + ), f"Aromatic compounds not correctly identified:\n" + "\n".join(mismatches) aromatic_count = len(aromatic_names) if aromatic_names else 0 print(f"✓ aromatic compounds identified correctly ({aromatic_count} found)") - + # === Test 6: n-alkane compounds identified === nalkane_names = { - compound for compound in fuel.compounds - if compound.startswith("n-C") + compound for compound in fuel.compounds if compound.startswith("n-C") } - + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if compound in nalkane_names: @@ -208,19 +207,21 @@ def test_hc_identification(self, fuel_name): mismatches.append( f"{compound}: should be n-alkane but got '{hc_type}'" ) - - assert not mismatches, ( - f"n-alkane compounds not correctly identified:\n" + "\n".join(mismatches) - ) + + assert ( + not mismatches + ), f"n-alkane compounds not correctly identified:\n" + "\n".join(mismatches) nalkane_count = len(nalkane_names) if nalkane_names else 0 print(f"✓ n-alkane compounds identified correctly ({nalkane_count} found)") - + # === Test 7: Cycloalkane compounds identified === cyclo_names = { - compound for compound in fuel.compounds - if "cycloparaffin" in compound.lower() and "aromatic" not in compound.lower() + compound + for compound in fuel.compounds + if "cycloparaffin" in compound.lower() + and "aromatic" not in compound.lower() } - + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if compound in cyclo_names: @@ -228,19 +229,18 @@ def test_hc_identification(self, fuel_name): mismatches.append( f"{compound}: should be cyclo-alkane but got '{hc_type}'" ) - - assert not mismatches, ( - f"Cycloalkane compounds not correctly identified:\n" + "\n".join(mismatches) - ) + + assert ( + not mismatches + ), f"Cycloalkane compounds not correctly identified:\n" + "\n".join(mismatches) cyclo_count = len(cyclo_names) if cyclo_names else 0 print(f"✓ cyclo-alkane compounds identified correctly ({cyclo_count} found)") - + # === Test 7b: iso-alkane compounds identified === isoalkane_names = { - compound for compound in fuel.compounds - if "Isoparaffin" in compound + compound for compound in fuel.compounds if "Isoparaffin" in compound } - + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if compound in isoalkane_names: @@ -248,19 +248,16 @@ def test_hc_identification(self, fuel_name): mismatches.append( f"{compound}: should be iso-alkane but got '{hc_type}'" ) - - assert not mismatches, ( - f"iso-alkane compounds not correctly identified:\n" + "\n".join(mismatches) - ) + + assert ( + not mismatches + ), f"iso-alkane compounds not correctly identified:\n" + "\n".join(mismatches) isoalkane_count = len(isoalkane_names) if isoalkane_names else 0 print(f"✓ iso-alkane compounds identified correctly ({isoalkane_count} found)") - + # === Test 8: Alkene compounds identified === - alkene_names = { - compound for compound in fuel.compounds - if "Alkene" in compound - } - + alkene_names = {compound for compound in fuel.compounds if "Alkene" in compound} + mismatches = [] for compound, hc_type in zip(fuel.compounds, fuel.hc_type): if compound in alkene_names: @@ -268,9 +265,9 @@ def test_hc_identification(self, fuel_name): mismatches.append( f"{compound}: should be alkene but got '{hc_type}'" ) - - assert not mismatches, ( - f"Alkene compounds not correctly identified:\n" + "\n".join(mismatches) - ) + + assert ( + not mismatches + ), f"Alkene compounds not correctly identified:\n" + "\n".join(mismatches) alkene_count = len(alkene_names) if alkene_names else 0 print(f"✓ alkene compounds identified correctly ({alkene_count} found)") diff --git a/tutorials/compositionPlots.py b/tutorials/compositionPlots.py index ac41ecd..7ffdf70 100644 --- a/tutorials/compositionPlots.py +++ b/tutorials/compositionPlots.py @@ -12,11 +12,14 @@ # Create a DataFrame with the compounds and their families # Use the hydrocarbon type classification from group decompositions family_names = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic"] -df = pd.DataFrame({ - "Compound": fuel.compounds, - "Weight %": fuel.Y_0 * 100, - "Family": fuel.hc_type, -}) +df = pd.DataFrame( + { + "Compound": fuel.compounds, + "Weight %": fuel.Y_0 * 100, + "Family": fuel.hc_type, + } +) + # Determine carbon number from compound name def determine_carbon_number(compound): @@ -40,6 +43,7 @@ def determine_carbon_number(compound): return np.nan return np.nan + df["nC"] = df["Compound"].apply(determine_carbon_number) # Remove rows with weight % <= 0.01 @@ -108,7 +112,9 @@ def determine_carbon_number(compound): # Plot 2: Pie chart of family composition # Only include families that have weight > 0 -families_present = [f for f in family_names if f in family_weights.index and family_weights[f] > 0] +families_present = [ + f for f in family_names if f in family_weights.index and family_weights[f] > 0 +] family_weights_sorted = family_weights[families_present] # Create pie chart without labels/percentages (we'll add them outside) @@ -121,15 +127,17 @@ def determine_carbon_number(compound): ) # Add percentages outside the pie with arrows -for wedge, value, family in zip(wedges, family_weights_sorted.values, family_weights_sorted.index): +for wedge, value, family in zip( + wedges, family_weights_sorted.values, family_weights_sorted.index +): angle = (wedge.theta2 + wedge.theta1) / 2 radius = 1.3 x = radius * np.cos(np.radians(angle)) y = radius * np.sin(np.radians(angle)) - + # Determine horizontal alignment based on position ha = "left" if x > 0 else "right" - + # Add annotation with arrow ax2.annotate( f"{value:.1f}%", @@ -162,4 +170,3 @@ def determine_carbon_number(compound): fig.suptitle("Fuel Composition", fontsize=16, fontweight="bold") plt.show() - From 17e73b51b3b959c8d0748abd75cea60648995ac7 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 13:21:06 -0600 Subject: [PATCH 25/48] Update docs, fix error in decomp for Cycloaromatic-C09 --- docs/development.rst | 9 +--- docs/tutorials-basic.rst | 10 +++- docs/tutorials-custom-fuels.rst | 21 ++------ fuellib/data/fuelData/dataReferences.md | 52 ------------------- fuellib/data/fuelData/gcData/decane_init.csv | 2 +- .../data/fuelData/gcData/dodecane_init.csv | 2 +- .../fuelData/gcData/heptane-decane_init.csv | 4 +- fuellib/data/fuelData/gcData/heptane_init.csv | 2 +- .../fuelData/groupDecompositionData/hefa.csv | 2 +- .../fuelData/groupDecompositionData/jet-a.csv | 2 +- .../groupDecompositionData/posf10264.csv | 2 +- .../groupDecompositionData/posf10289.csv | 2 +- .../groupDecompositionData/posf10325.csv | 2 +- .../groupDecompositionData/posf4658.csv | 2 +- .../groupDecompositionData/refCompounds.csv | 4 +- tests/test_hc_identification.py | 4 +- 16 files changed, 29 insertions(+), 93 deletions(-) delete mode 100644 fuellib/data/fuelData/dataReferences.md diff --git a/docs/development.rst b/docs/development.rst index 4cf4fbf..a20bd9d 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -43,14 +43,7 @@ New contributions are always welcome! To contribute: 4. Ensure development dependencies are installed (see Development Setup above) 5. Format your code using Black ``fl-format`` -6. Run tests to verify your changes: - - .. code-block:: bash - - python tests/test_api.py - python tests/test_accuracy.py - python tests/test_source_docstrings.py - +6. Run tests to verify your changes. See `.github/workflows/ci.yml` for the most up-to-date list of tests run in CI 7. Open a Pull Request (PR) from your fork to the main FuelLib repository Building and Viewing Documentation Locally diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index e5aefb7..12a1c15 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -23,7 +23,7 @@ If you want to run the example scripts, you can either clone the repository or d Required Input Files ^^^^^^^^^^^^^^^^^^^^^ -FuelLib requires two input files for any given fuel, ````: +FuelLib comes with a variety of built-in fuels with pre-populated input files, but you can also add your own custom fuels by providing the required input files. Each fuel requires two input files: - ``FuelLib/fuelData/gcData/_init.csv``: the initial weight percentage composition of the fuel components (must include columns "Compound" and "Weight %") - ``FuelLib/fuelData/groupDecompositionData/.csv``: the fundamental group decomposition for each component of the fuel (must have columns for groups in the same order as `gcmTable `_) @@ -32,7 +32,7 @@ These two required files must have the same number of rows and the same order of **Fuel Metadata** -For custom fuels, a ``fuel_metadata.yaml`` file is required to define decomposition name mappings. This allows you to map fuel variants to the correct group decomposition file. See the `Adding Custom Fuels `_ tutorial for details on the metadata file format and structure. +A ``fuel_metadata.yaml`` file is required to define decomposition name mappings. This allows you to map multiple fuel variants to a shared group decomposition file. See the `Adding Custom Fuels `_ tutorial for details on the metadata file format and structure. Decomposing Fuel Components into Fundamental Groups ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -66,6 +66,12 @@ the remaining branch with a single CH3 group bonded to a CH2 group is not define | (1,5-dimethylhexyl)cyclohexane | 3 | 8 | 3 | ... | 1 | 1 | +--------------------------------+-------+-------+-------+-----+----------+-----------------+ +.. note:: + All group decomposition files must follow the groups defined in `gcmTable`_, there are :math:`N_{g1} = 78` + first-order groups and :math:`N_{g2} = 43` second order groups. The second-order groups start with the + branching structure `(CH3)2CH`. Not all branching structures are defined in the `gcmTable`_. We recommend + starting with `groupDecompositionData/refCompounds.csv` and adapting the decompositions and compounds for your fuel. + Basic Usage ^^^^^^^^^^^ diff --git a/docs/tutorials-custom-fuels.rst b/docs/tutorials-custom-fuels.rst index dbe2243..6ef6c5f 100644 --- a/docs/tutorials-custom-fuels.rst +++ b/docs/tutorials-custom-fuels.rst @@ -10,7 +10,7 @@ Create a fuel data directory with this structure: .. code-block:: text - your_fueldata_dir/ + customFuels/ ├── gcData/ │ └── your_fuel_name_init.csv ├── groupDecompositionData/ @@ -89,39 +89,28 @@ See the `Basic Usage tutorial 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* +Compound,CH3 (1),CH2 (2),CH (3),C (4),CH2=CH (1),CH=CH (2),CH2=C (2),CH=C (3),C=C (4),CH2=C=CH(1),ACH (2),AC (3),ACCH3 (2),ACCH2 (3),ACCH (4),OH (1),ACOH (2),CH3CO (1),CH2CO (2),CHO (1)*,CH3COO (1),CH2COO (2),HCOO (1),CH30 (1),CH20 (2),CH-O (3),FCH20 (1)*,CH2NH2 (1),CHNH2 (2),CH3NH (2),CH2NH (3),CHNH (4)*,CH3N (2),CH2N (3),ACNH2 (2),C5H4N (1),C5H3N (2),CH2CN (1)*,COOH (1),CH2C1 (1),CHC1 (2),CC1 (3),CHC12 (1)*,CC13 (1),CC12 (2),ACC1 (2),CH2N02 (1)*,CHN02 (2)*,ACN02 (2)*,CH2SH (1),C1(1)*,Br (1),CH≡C (1),C≡C (2)*,Cl—(C=C) (3)*,ACF (2),HCON(CH2)2 (2)*,CF3 (1),CF2 (2),CF (3),COO (2),CC12F (1),HCC1F (1),CC1F2 (1),FSpecial (1),CONH2 (1)*,CONHCH3 (1)*,CONHCH2 (1)*,CON(CH3)2 (1)*,CONCH2CH2 (3)*,CON(CH2)2 (3)*,C2H502 (1)*,C2H402 (2),CH3S (1),CH2S (2),CHS (3)*,C4H3S (1),C4H2S (2)*,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CR=CRm—CRp=CRk m, p G (0,1), K n G (0,2)","CH3-CHm=CH, m G (0,1), n G (0,2)","CH2-CHm=CH, m G (0,1), n G (0,2)","CH—CUm=CUn or C—CHm=CH/ m G (0,1), n G (0,2)",Alicyclic side-chain CcyclicCm m > 1,ch3ch3,CHCHO or CCHO*,CH3COCH2,CH3COCH or CH3COC,Ccyclic^=0,ACCHO*,CHCOOH or CCOOH*,ACCOOH*,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO*, CO—O—CO,ACCOO*,CHOH,COH,CHm(OH)CHn(OH),CHm cyclic-OH,CHn(OH)CHm(NHp),CHm(NH2)CHn(NH2)*,CHm cyclic—NHp—CHn cyclic*,CHnOCHmCHp*,AC—O—CHm*,CHm cyclic—S—CHn cyclic,CHnCHm—F,CHnCHm—Br*,CHnCHm—I*,ACBr*,ACI*,CHm(NH2)—COOH* Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -14,7 +14,7 @@ Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Diaromatic-C14,1,2,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/tests/test_hc_identification.py b/tests/test_hc_identification.py index d4693a9..d34d214 100644 --- a/tests/test_hc_identification.py +++ b/tests/test_hc_identification.py @@ -9,9 +9,9 @@ def get_available_fuels(): """Discover available fuels from fuelData/gcData directory.""" - gcdata_dir = Path(__file__).parent.parent / "fuelData" / "gcData" + gcdata_dir = fl.get_fueldata_gc_dir() fuels = sorted( - [f.name.replace("_init.csv", "") for f in gcdata_dir.glob("*_init.csv")] + [f.name.replace("_init.csv", "") for f in Path(gcdata_dir).glob("*_init.csv")] ) return fuels From 83cc6189407287c47c855cecd02aad21ecba4a53 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 15:22:00 -0600 Subject: [PATCH 26/48] Update baselines after bug in decomp. Update plotting and custom fuel handling --- docs/tutorials-custom-fuels.rst | 4 +- fuellib/__init__.py | 72 +++++++++++- fuellib/_data_locator.py | 108 ++++++++++++++++-- fuellib/utilities/plotting.py | 85 ++++++++------ .../baselinePredictions/generate_baseline.py | 13 ++- tests/baselinePredictions/posf10264.csv | 22 ++-- tests/baselinePredictions/posf10289.csv | 26 ++--- tests/baselinePredictions/posf10325.csv | 20 ++-- 8 files changed, 261 insertions(+), 89 deletions(-) diff --git a/docs/tutorials-custom-fuels.rst b/docs/tutorials-custom-fuels.rst index 6ef6c5f..19f218b 100644 --- a/docs/tutorials-custom-fuels.rst +++ b/docs/tutorials-custom-fuels.rst @@ -56,7 +56,9 @@ You can add additional metadata for documentation: source: Citation or origin of fuel data reference: URL to source paper description: Brief description of the fuel - decomp_name: your_fuel + decomp_name: name_of_decomposition_file in ``groupDecompositionData/`` (without ``.csv`` extension) + props_data: Name of any related properties data file in ``propertiesData/`` (without ``.csv`` extension) + Note that you can assign the same decomposition to multiple fuel variants if they have identical bulk composition. diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 74fd596..e155525 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -24,6 +24,7 @@ get_fueldata_decomp_dir, get_fueldata_props_dir, get_decomp_name_from_metadata, + get_props_data_from_metadata, ) # Physical constants @@ -40,7 +41,12 @@ "droplet_volume", "droplet_mass", "epsilon_to_characteristic_temperature", + "get_fueldata_dir", + "get_fueldata_gc_dir", + "get_fueldata_decomp_dir", "get_fueldata_props_dir", + "get_decomp_name_from_metadata", + "get_props_data_from_metadata", ] @@ -54,6 +60,58 @@ class fuel: :type decompName: str, optional :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. :type fuelDataDir: str, optional + + **Data Directory Attributes:** + + :ivar fuelDataDir: Root directory for fuel data (custom or embedded). + :ivar fuelDataGcDir: Directory containing GCxGC compositional data files. + :ivar fuelDataDecompDir: Directory containing functional group decomposition files. + :ivar fuelDataPropsDir: Directory containing experimental property data (may be None). + + **Composition Attributes:** + + :ivar name: Name of the fuel/mixture. + :ivar compounds: List of compound names in the mixture. + :ivar formulas: Molecular formulas for each compound (if available). + :ivar Y_0: Mass fractions of each compound (array, shape: num_compounds). + :ivar Nij: Functional group decomposition matrix (array, shape: num_compounds × num_groups). + :ivar num_compounds: Number of compounds in the mixture. + :ivar num_groups: Number of functional groups in the decomposition. + + **Pure Component Properties (Critical, Molecular):** + + :ivar MW: Molecular weights in kg/mol (array, shape: num_compounds). + :ivar Tc: Critical temperatures in K (array, shape: num_compounds). + :ivar Pc: Critical pressures in Pa (array, shape: num_compounds). + :ivar Vc: Critical volumes in m³/mol (array, shape: num_compounds). + :ivar Tb: Boiling temperatures in K (array, shape: num_compounds). + :ivar Tm: Melting temperatures in K (array, shape: num_compounds). + + **Thermodynamic Properties (at 298.15 K):** + + :ivar Hf: Enthalpy of formation in J/mol (array, shape: num_compounds). + :ivar Gf: Gibbs free energy in J/mol (array, shape: num_compounds). + :ivar Hv_stp: Enthalpy of vaporization at 298 K in J/mol (array, shape: num_compounds). + :ivar Lv_stp: Latent heat of vaporization at 298 K in J/kg (array, shape: num_compounds). + :ivar Cp_stp: Molar specific heat at 298 K in J/mol/K (array, shape: num_compounds). + :ivar Vm_stp: Molar liquid volume at 298 K in m³/mol (array, shape: num_compounds). + :ivar omega: Acentric factors (array, shape: num_compounds). + + **Lennard-Jones Transport Parameters:** + + :ivar sigma: Lennard-Jones collision diameters in m (array, shape: num_compounds). + :ivar epsilonByKB: Lennard-Jones well depths in K (array, shape: num_compounds). + + **Classification Attributes:** + + :ivar hc_type: Hydrocarbon types ("n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene"). + :ivar fam: Family codes for thermal conductivity (0: saturated, 1: aromatic, 2: cycloparaffin, 3: olefin). + :ivar nC: Carbon numbers (array, shape: num_compounds). + :ivar nH: Hydrogen numbers (array, shape: num_compounds). + + **Optional Attributes:** + + :ivar pelephysics_keys: PelePhysics keys for each compound (if available). """ # Number of first and second order groups from Constantinou and Gani @@ -77,19 +135,21 @@ def __init__(self, name, decompName=None, fuelDataDir=None): # Try to get decomposition name from metadata decompName = get_decomp_name_from_metadata(name, fuelDataDir) - # Determine which data directories to use + # Determine and set data directories for this fuel instance if fuelDataDir is None: # Use built-in embedded data self.fuelDataDir = get_fueldata_dir() self.fuelDataGcDir = get_fueldata_gc_dir() self.fuelDataDecompDir = get_fueldata_decomp_dir() + self.fuelDataPropsDir = get_fueldata_props_dir() else: - # Use user-provided custom data directory + # Validate and use custom fuel directory + from ._data_locator import _validate_fuel_data_dir, _get_props_dir_for_fueldata + _validate_fuel_data_dir(fuelDataDir) self.fuelDataDir = fuelDataDir - self.fuelDataGcDir = os.path.join(self.fuelDataDir, "gcData") - self.fuelDataDecompDir = os.path.join( - self.fuelDataDir, "groupDecompositionData" - ) + self.fuelDataGcDir = os.path.join(fuelDataDir, "gcData") + self.fuelDataDecompDir = os.path.join(fuelDataDir, "groupDecompositionData") + self.fuelDataPropsDir = _get_props_dir_for_fueldata(fuelDataDir) # Get GCM table directory (always from built-in data) gcmtable_dir = get_gcmtable_dir() diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index c532f0e..e66f44a 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -21,9 +21,49 @@ HAS_YAML = False +def _validate_fuel_data_dir(fuel_data_dir): + """ + Validate that a custom fuel data directory has required subdirectories. + + :param fuel_data_dir: Path to fuel data directory. + :type fuel_data_dir: str + :raises ValueError: If required subdirectories are missing. + """ + if fuel_data_dir is None: + return + + gc_dir = os.path.join(fuel_data_dir, "gcData") + decomp_dir = os.path.join(fuel_data_dir, "groupDecompositionData") + + if not os.path.isdir(gc_dir): + raise ValueError( + f"Custom fuel data directory is missing 'gcData' subdirectory:\n" + f" Expected: {gc_dir}" + ) + + if not os.path.isdir(decomp_dir): + raise ValueError( + f"Custom fuel data directory is missing 'groupDecompositionData' subdirectory:\n" + f" Expected: {decomp_dir}" + ) + + +def _get_props_dir_for_fueldata(fuel_data_dir): + """ + Get the properties directory for a fuel data directory, or None if it doesn't exist. + + :param fuel_data_dir: Path to fuel data directory. + :type fuel_data_dir: str + :return: Path to properties directory, or None if not found. + :rtype: str or None + """ + props_dir = os.path.join(fuel_data_dir, "propertiesData") + return props_dir if os.path.isdir(props_dir) else None + + def get_data_dir(): """ - Get the path to the embedded data directory. + Get the path to FuelLib's data directory. :return: Absolute path to the data directory. :rtype: str @@ -45,9 +85,9 @@ def get_gcmtable_dir(): def get_fueldata_dir(): """ - Get the path to the fuel data directory. + Get the path to FuelLib's fuel data directory. - :return: Absolute path to fuelData directory. + :return: Absolute path to embedded fuelData directory. :rtype: str """ return os.path.join(get_data_dir(), "fuelData") @@ -55,9 +95,9 @@ def get_fueldata_dir(): def get_fueldata_gc_dir(): """ - Get the path to the GC data subdirectory. + Get the path to FuelLib's GC data subdirectory. - :return: Absolute path to fuelData/gcData directory. + :return: Absolute path to embedded fuelData/gcData directory. :rtype: str """ return os.path.join(get_fueldata_dir(), "gcData") @@ -65,9 +105,9 @@ def get_fueldata_gc_dir(): def get_fueldata_decomp_dir(): """ - Get the path to the group decomposition data subdirectory. + Get the path to FuelLib's group decomposition data subdirectory. - :return: Absolute path to fuelData/groupDecompositionData directory. + :return: Absolute path to embedded fuelData/groupDecompositionData directory. :rtype: str """ return os.path.join(get_fueldata_dir(), "groupDecompositionData") @@ -75,12 +115,14 @@ def get_fueldata_decomp_dir(): def get_fueldata_props_dir(): """ - Get the path to the properties data subdirectory. + Get the path to FuelLib's properties data subdirectory, or None if not found. + + This directory is optional. - :return: Absolute path to fuelData/propertiesData directory. - :rtype: str + :return: Absolute path to embedded fuelData/propertiesData directory, or None if not found. + :rtype: str or None """ - return os.path.join(get_fueldata_dir(), "propertiesData") + return _get_props_dir_for_fueldata(get_fueldata_dir()) def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): @@ -163,3 +205,47 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): ) return fuel_meta["decomp_name"] + + +def get_props_data_from_metadata(fuel_name, fuel_data_dir=None): + """ + Load properties data name mapping from fuel_metadata.yaml. + + Returns None if props_data is not specified in metadata (it's optional). + + :param fuel_name: Name of the fuel to look up. + :type fuel_name: str + :param fuel_data_dir: Directory containing fuel data. If None, uses embedded data. + :type fuel_data_dir: str, optional + :return: Properties data name from metadata, or None if not specified. + :rtype: str or None + :raises FileNotFoundError: If fuel_metadata.yaml is missing or fuel not found in metadata + """ + if not HAS_YAML: + raise ImportError( + "PyYAML is required to use custom fuels. Install it with: pip install pyyaml" + ) + + if fuel_data_dir is None: + # Use embedded data + metadata_file = os.path.join(get_fueldata_dir(), "fuel_metadata.yaml") + else: + # Use custom data directory + metadata_file = os.path.join(fuel_data_dir, "fuel_metadata.yaml") + + if not os.path.exists(metadata_file): + return None + + try: + with open(metadata_file, "r") as f: + data = yaml.safe_load(f) + except Exception: + return None + + if not data or "fuels" not in data or fuel_name not in data["fuels"]: + return None + + fuel_meta = data["fuels"][fuel_name] + + # Return props_data if present, otherwise None + return fuel_meta.get("props_data", None) diff --git a/fuellib/utilities/plotting.py b/fuellib/utilities/plotting.py index 231174f..2cde8fe 100644 --- a/fuellib/utilities/plotting.py +++ b/fuellib/utilities/plotting.py @@ -320,17 +320,27 @@ def plot_mixture_properties( "ThermalConductivity": r"Thermal Conductivity [W/m/K]", } - # Line specs for different fuels + # Line specs for different fuels (marker styles) line_specs_map = { - "decane": ("o", "o"), - "posf10325": ("o", "o"), - "dodecane": ("s", "s"), - "posf10289": ("s", "s"), - "heptane": ("D", "D"), - "posf10264": ("D", "D"), - "posf11498": ("^", "^"), - "jet-a": ("v", "v"), - "hefa": ("p", "p"), + "decane": "o", + "posf10325": "o", + "dodecane": "s", + "posf10289": "s", + "heptane": "D", + "posf10264": "D", + "posf11498": "^", + "jet-a": "v", + "hefa": "p", + } + + # Fuel-specific colors + fuel_color_map = { + "posf10264": "#2980B9", # Primary Blue + "posf10325": "#7f7f7f", # 50% Gray + "posf10289": "#333333", # Dark Gray + "heptane": "#2980B9", # Primary Blue + "decane": "#7f7f7f", # 50% Gray + "dodecane": "#333333", # Dark Gray } # Color palette for cycling through distinct colors @@ -357,11 +367,14 @@ def get_line_spec(fuel_name, fuel_index=0): marker_style = "o" # Default for key, spec in line_specs_map.items(): if key in fuel_name.lower(): - marker_style = spec[0] + marker_style = spec break - # Get color from palette using fuel index - color = color_palette[fuel_index % len(color_palette)] + # Get color: use fuel-specific mapping if available, otherwise use palette + if fuel_name in fuel_color_map: + color = fuel_color_map[fuel_name] + else: + color = color_palette[fuel_index % len(color_palette)] return (color, marker_style) def get_legend_label(fuel_name): @@ -384,21 +397,26 @@ def get_predictions_and_data(fuel_name, prop_name): fuel = fl.fuel(fuel_name, decompName=decomp_name, fuelDataDir=fuel_data_dir) # Try to load experimental data - props_dir = fl.get_fueldata_props_dir() - data_file = os.path.join(props_dir, f"{fuel_name}.csv") - + props_dir = fuel.fuelDataPropsDir + T_data = pd.Series(dtype=float) prop_data = pd.Series(dtype=float) - if os.path.exists(data_file): - try: - data = pd.read_csv(data_file, skiprows=[1]) - if prop_name in data.columns: - mask = data[prop_name].notna() - T_data = data.loc[mask, "Temperature"] - prop_data = data.loc[mask, prop_name] - except Exception: - pass + if props_dir and os.path.exists(props_dir): + # Check if metadata specifies a different props_data filename + props_data_name = fl.get_props_data_from_metadata(fuel_name, fuel_data_dir) + data_filename = props_data_name if props_data_name else fuel_name + + data_file = os.path.join(props_dir, f"{data_filename}.csv") + if os.path.exists(data_file): + try: + data = pd.read_csv(data_file, skiprows=[1]) + if prop_name in data.columns: + mask = data[prop_name].notna() + T_data = data.loc[mask, "Temperature"] + prop_data = data.loc[mask, prop_name] + except Exception: + pass # Generate predictions over temperature range # First check if experimental data exists - use its range if available @@ -460,31 +478,34 @@ def get_predictions_and_data(fuel_name, prop_name): "-", color=line_color, label=f"FuelLib: {get_legend_label(fuel_name)}", - linewidth=2, + linewidth=4, ) # Plot experimental data if available if len(prop_data) > 0: + # Get props_data name for the legend + props_data_name = fl.get_props_data_from_metadata(fuel_name, fuel_data_dir) + data_label = props_data_name if props_data_name else fuel_name ax[i].scatter( T_data, prop_data, marker=marker_style, - label=f"Data: {get_legend_label(fuel_name)}", + label=f"Data: {get_legend_label(data_label)}", facecolors=line_color, - s=50, + s=75, zorder=5, ) # Format subplot - ax[i].set_xlabel("T [°C]", fontsize=12) - ax[i].set_ylabel(ylab.get(prop_name, prop_name), fontsize=12) - ax[i].tick_params(labelsize=10) + ax[i].set_xlabel("T [°C]", fontsize=18) + ax[i].set_ylabel(ylab.get(prop_name, prop_name), fontsize=18) + ax[i].tick_params(labelsize=18) ax[i].grid(alpha=0.3) # Add legend handles, labels = ax[0].get_legend_handles_labels() fig.legend( - handles, labels, loc="outside lower center", ncol=len(fuel_names), fontsize=10 + handles, labels, loc="outside lower center", ncol=len(fuel_names), fontsize=18 ) if title: diff --git a/tests/baselinePredictions/generate_baseline.py b/tests/baselinePredictions/generate_baseline.py index 67d6efe..0b91f05 100644 --- a/tests/baselinePredictions/generate_baseline.py +++ b/tests/baselinePredictions/generate_baseline.py @@ -11,12 +11,15 @@ # Add the FuelLib directory to the Python path FUELLIB_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) if FUELLIB_DIR not in sys.path: - sys.path.append(FUELLIB_DIR) -from paths import * + sys.path.insert(0, FUELLIB_DIR) -sys.path.append(os.path.join(FUELLIB_DIR, "tests")) -import FuelLib as fl -from get_pred_and_data import * +# Add the tests directory to import get_pred_and_data +TESTS_DIR = os.path.dirname(os.path.dirname(__file__)) +if TESTS_DIR not in sys.path: + sys.path.insert(0, TESTS_DIR) + +import fuellib as fl +from get_pred_and_data import get_pred_and_data # Directories for tests and baseline predictions # test_dir = os.path.dirname(__file__) diff --git a/tests/baselinePredictions/posf10264.csv b/tests/baselinePredictions/posf10264.csv index 46d1765..f5eac7c 100644 --- a/tests/baselinePredictions/posf10264.csv +++ b/tests/baselinePredictions/posf10264.csv @@ -1,13 +1,13 @@ Temperature,Density,Error_Density,Viscosity,Error_Viscosity,VaporPressure,Error_VaporPressure,SurfaceTension,Error_SurfaceTension,ThermalConductivity,Error_ThermalConductivity C,g/cm^3,g/cm^3,mm^2/s,mm^2/s,kPa,kPa,N/m,N/m,W/m/K,W/m/K --40.0,0.8155335646187369,0.007441435381263073,5.385883820556434,1.2141161794435655,,,,,, --20.0,0.8017870163101283,0.00681298368987171,3.186551296191339,0.31344870380866086,,,,,, --10.0,,,,,,,0.027399809834902835,0.0015573708349028367,, -0.0,0.7877750159741987,0.006449984025801214,,,0.20168590601758393,0.15333557601758394,,,0.12754384230554927,0.0014946196944507217 -20.0,0.7734734981982996,0.006376501801700463,,,0.6032234151495549,0.02533086985044508,0.02476740982671452,0.0009311718267145212,, -30.0,,,,,,,,,0.12143487551294638,0.0026035864870536246 -40.0,0.758854670606472,0.006428662393527906,1.1202487212301215,0.019751278769878367,1.5852102148738378,0.18305065687383792,0.023040303411569155,0.00020663641156915685,0.11943453010186489,0.000565469898135107 -60.0,,,,,3.7367158627205708,0.3038424617205706,,,0.11546676509633357,0.0006870809036664399 -80.0,,,,,8.028295546971819,0.6306951189718193,,,, -100.0,,,0.5992371143133661,0.01076288568663386,15.923196354015541,1.3213968140155412,,,, -120.0,,,,,29.46321488373632,2.8705336037363196,,,, +-40.0,0.8155103856313599,0.007464614368640099,5.384548853271682,1.2154511467283173,,,,,, +-20.0,0.8017636954386373,0.006836304561362638,3.1858812644715027,0.31411873552849734,,,,,, +-10.0,,,,,,,0.02739964557873879,0.0015572065787387915,, +0.0,0.7877515362472498,0.006473463752750153,,,0.2019489253708018,0.1535985953708018,,,0.1275435749655079,0.001494887034492104 +20.0,0.773449840420139,0.006400159579861064,,,0.6039256775538239,0.02462860744617612,0.024767103410105146,0.0009308654101051472,, +30.0,,,,,,,,,0.12143449347415747,0.0026039685258425344 +40.0,0.7588308129406026,0.0064525200593973375,1.1200887164361617,0.0199112835638382,1.5868450780907746,0.18468552009077466,0.023039904918752383,0.00020623791875238467,0.11943410886708083,0.0005658911329191607 +60.0,,,,,3.7401171991572113,0.30724379815721115,,,0.1154662638321051,0.0006875821678948985 +80.0,,,,,8.034741768664695,0.6371413406646953,,,, +100.0,,,0.5991728391147394,0.01082716088526059,15.934494237972615,1.3326946979726149,,,, +120.0,,,,,29.48174921391003,2.889067933910031,,,, diff --git a/tests/baselinePredictions/posf10289.csv b/tests/baselinePredictions/posf10289.csv index bedf839..b657506 100644 --- a/tests/baselinePredictions/posf10289.csv +++ b/tests/baselinePredictions/posf10289.csv @@ -1,15 +1,15 @@ Temperature,Density,Error_Density,Viscosity,Error_Viscosity,VaporPressure,Error_VaporPressure,SurfaceTension,Error_SurfaceTension,ThermalConductivity,Error_ThermalConductivity C,g/cm^3,g/cm^3,mm^2/s,mm^2/s,kPa,kPa,N/m,N/m,W/m/K,W/m/K --40.0,,,7.507948035184114,6.5920519648158855,,,,,, --20.0,,,4.24045399508395,2.25954600491605,,,,,, --10.0,,,,,,,0.028407578965936976,1.3851034063025458e-05,, -0.0,0.8309075418516484,0.007784125148351584,,,0.08660861469983731,0.03825828469983732,,,, -20.0,0.8168993942721436,0.007033938727856404,,,0.27321768591796414,0.06523462108203587,0.02587880375673309,0.00015129275673309017,, -30.0,,,,,,,,,0.10792801466210523,0.010052754337894765 -40.0,0.8026057063960078,0.007144293603992158,1.367514017820846,0.20248598217915403,0.7531450373224744,0.3179920713224744,0.024217518294994553,0.0005074207050054479,, -60.0,,,,,1.8537008936525574,0.5482419946525574,,,, -75.0,,,,,,,,,0.10045608472357537,0.008486223276424634 -80.0,,,,,4.142277288892066,0.8061045468920658,,,, -100.0,,,0.6977234633132008,0.06227653668679922,8.516417387410218,2.1341738814102182,,,, -120.0,,,,,16.286558420578324,2.5067144905783234,,,, -125.0,,,,,,,,,0.09225950233374283,0.00860588266625717 +-40.0,,,7.505044907152401,6.594955092847599,,,,,, +-20.0,,,4.2390408189958135,2.2609591810041865,,,,,, +-10.0,,,,,,,0.028407237447798647,1.4192552201353764e-05,, +0.0,0.8308723433887537,0.007819323611246265,,,0.08704862669817676,0.03869829669817676,,,, +20.0,0.8168639288926455,0.007069404107354571,,,0.27439414117821065,0.06405816582178936,0.0258782214609667,0.00015071046096669719,, +30.0,,,,,,,,,0.10792761258438621,0.010053156415613787 +40.0,0.8025699413648093,0.007180058635190667,1.3671951736956889,0.20280482630431118,0.7558883689289037,0.3207354029289037,0.02421678014184961,0.0005081588581503926,, +60.0,,,,,1.8594192315039126,0.5539603325039126,,,, +75.0,,,,,,,,,0.10045548410130546,0.00848682389869454 +80.0,,,,,4.1531373227981625,0.8169645807981625,,,, +100.0,,,0.6975992964511253,0.062400703548874725,8.535493574870209,2.153250068870209,,,, +120.0,,,,,16.317926296740087,2.5380823667400865,,,, +125.0,,,,,,,,,0.09225865338450474,0.008606731615495258 diff --git a/tests/baselinePredictions/posf10325.csv b/tests/baselinePredictions/posf10325.csv index dcefb1a..4c799fd 100644 --- a/tests/baselinePredictions/posf10325.csv +++ b/tests/baselinePredictions/posf10325.csv @@ -1,12 +1,12 @@ Temperature,Density,Error_Density,Viscosity,Error_Viscosity,VaporPressure,Error_VaporPressure,SurfaceTension,Error_SurfaceTension,ThermalConductivity,Error_ThermalConductivity C,g/cm^3,g/cm^3,mm^2/s,mm^2/s,kPa,kPa,N/m,N/m,W/m/K,W/m/K --40.0,0.8351805862254434,0.00868608077455657,6.46195013881539,2.738049861184609,,,,,, --20.0,0.8215770343700424,0.008106298629957598,3.7221869857688796,0.7778130142311204,,,,,, --10.0,,,,,,,0.02794563148900469,8.277151099531088e-05,, -0.0,0.8077210579942483,0.007395609005751647,,,0.15123802785325355,0.10288769785325355,,,0.121532038531724,0.0026987304682760116 -20.0,0.7935906587552476,0.008109341244752377,,,0.4573916369164672,0.02223867091646725,0.025362374564334628,0.0005436355643346283,0.11773349322663719,0.002458814773362808 -40.0,0.779160570944024,0.00816442905597603,1.2465786144401685,0.06342138555983157,1.2129921587874934,0.3910365557874934,0.023666414390480225,4.678239048022323e-05,0.11401351334435658,0.002044178655643422 -60.0,,,,,2.882097588054224,0.6096320970542237,,,0.1103462678289954,0.0018652701710046016 -80.0,,,,,6.237942743287926,1.3062091242879257,,,, -100.0,,,0.6497220808733932,0.030277919126606823,12.461340400164664,2.597873163164664,,,, -120.0,,,,,23.22344459897438,4.463516718974379,,,, +-40.0,0.8351574072380663,0.008709259761933708,6.460319977618209,2.7396800223817905,,,,,, +-20.0,0.8215537134985513,0.008129619501448637,3.7213832449838535,0.7786167550161465,,,,,, +-10.0,,,,,,,0.02794543468604107,8.2968313958931e-05,, +0.0,0.8076975782672994,0.007419088732700585,,,0.15151571402646025,0.10316538402646025,,,0.12153180724111683,0.0026989617588831782 +20.0,0.793567000977087,0.008132999022912979,,,0.45813356614511086,0.022980600145110885,0.0253620266788215,0.000543287678821499,0.11773319540798219,0.002459112592017809 +40.0,0.7791367132781545,0.008188286721845572,1.2463927637332222,0.06360723626677789,1.2147208541399832,0.3927652511399832,0.023665968681056217,4.6336681056215884e-05,0.11401314690365934,0.0020445450963406664 +60.0,,,,,2.8856977901650787,0.6132322991650785,,,0.11034583033821149,0.0018657076617885071 +80.0,,,,,6.2447736169035775,1.3130399979035774,,,, +100.0,,,0.6496486957331365,0.0303513042668635,12.473327173108917,2.6098599361089168,,,, +120.0,,,,,23.243134550414723,4.483206670414724,,,, From 67aee46377ad39559da5a56291f33e50f0a69805 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 15:26:37 -0600 Subject: [PATCH 27/48] Format --- fuellib/__init__.py | 6 +++++- fuellib/_data_locator.py | 16 ++++++++-------- fuellib/utilities/plotting.py | 8 +++++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index e155525..fcf40d8 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -144,7 +144,11 @@ def __init__(self, name, decompName=None, fuelDataDir=None): self.fuelDataPropsDir = get_fueldata_props_dir() else: # Validate and use custom fuel directory - from ._data_locator import _validate_fuel_data_dir, _get_props_dir_for_fueldata + from ._data_locator import ( + _validate_fuel_data_dir, + _get_props_dir_for_fueldata, + ) + _validate_fuel_data_dir(fuelDataDir) self.fuelDataDir = fuelDataDir self.fuelDataGcDir = os.path.join(fuelDataDir, "gcData") diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index e66f44a..865248a 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -24,23 +24,23 @@ def _validate_fuel_data_dir(fuel_data_dir): """ Validate that a custom fuel data directory has required subdirectories. - + :param fuel_data_dir: Path to fuel data directory. :type fuel_data_dir: str :raises ValueError: If required subdirectories are missing. """ if fuel_data_dir is None: return - + gc_dir = os.path.join(fuel_data_dir, "gcData") decomp_dir = os.path.join(fuel_data_dir, "groupDecompositionData") - + if not os.path.isdir(gc_dir): raise ValueError( f"Custom fuel data directory is missing 'gcData' subdirectory:\n" f" Expected: {gc_dir}" ) - + if not os.path.isdir(decomp_dir): raise ValueError( f"Custom fuel data directory is missing 'groupDecompositionData' subdirectory:\n" @@ -51,7 +51,7 @@ def _validate_fuel_data_dir(fuel_data_dir): def _get_props_dir_for_fueldata(fuel_data_dir): """ Get the properties directory for a fuel data directory, or None if it doesn't exist. - + :param fuel_data_dir: Path to fuel data directory. :type fuel_data_dir: str :return: Path to properties directory, or None if not found. @@ -116,7 +116,7 @@ def get_fueldata_decomp_dir(): def get_fueldata_props_dir(): """ Get the path to FuelLib's properties data subdirectory, or None if not found. - + This directory is optional. :return: Absolute path to embedded fuelData/propertiesData directory, or None if not found. @@ -210,7 +210,7 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): def get_props_data_from_metadata(fuel_name, fuel_data_dir=None): """ Load properties data name mapping from fuel_metadata.yaml. - + Returns None if props_data is not specified in metadata (it's optional). :param fuel_name: Name of the fuel to look up. @@ -246,6 +246,6 @@ def get_props_data_from_metadata(fuel_name, fuel_data_dir=None): return None fuel_meta = data["fuels"][fuel_name] - + # Return props_data if present, otherwise None return fuel_meta.get("props_data", None) diff --git a/fuellib/utilities/plotting.py b/fuellib/utilities/plotting.py index 2cde8fe..c529473 100644 --- a/fuellib/utilities/plotting.py +++ b/fuellib/utilities/plotting.py @@ -398,7 +398,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Try to load experimental data props_dir = fuel.fuelDataPropsDir - + T_data = pd.Series(dtype=float) prop_data = pd.Series(dtype=float) @@ -406,7 +406,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Check if metadata specifies a different props_data filename props_data_name = fl.get_props_data_from_metadata(fuel_name, fuel_data_dir) data_filename = props_data_name if props_data_name else fuel_name - + data_file = os.path.join(props_dir, f"{data_filename}.csv") if os.path.exists(data_file): try: @@ -484,7 +484,9 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot experimental data if available if len(prop_data) > 0: # Get props_data name for the legend - props_data_name = fl.get_props_data_from_metadata(fuel_name, fuel_data_dir) + props_data_name = fl.get_props_data_from_metadata( + fuel_name, fuel_data_dir + ) data_label = props_data_name if props_data_name else fuel_name ax[i].scatter( T_data, From 0c5b26c9b8595796c9ee4e44f619c7d491648b51 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 16:26:48 -0600 Subject: [PATCH 28/48] Add documentation for CLI --- README.md | 59 +---------- docs/figures/composition_posf10325.png | Bin 0 -> 180271 bytes ...operties_posf10264_posf10325_posf10289.png | Bin 0 -> 582758 bytes docs/tutorials-cli.rst | 94 ++++++++++++++++++ docs/tutorials.rst | 1 + fuellib/__init__.py | 52 ++++++++++ fuellib/utilities/plotting.py | 1 - fuellib/utilities/temp_converter.py | 68 ++++++++++++- pyproject.toml | 4 + 9 files changed, 219 insertions(+), 60 deletions(-) create mode 100644 docs/figures/composition_posf10325.png create mode 100644 docs/figures/mixture_properties_posf10264_posf10325_posf10289.png create mode 100644 docs/tutorials-cli.rst diff --git a/README.md b/README.md index 4ca0025..84e9df7 100644 --- a/README.md +++ b/README.md @@ -50,65 +50,10 @@ pip install fuellib ``` ## Library Usage -This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, [`tutorials/basic.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/basic.py), which is documented at [https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction](https://NatLabRockies.github.io/FuelLib/tutorials.html#introduction). The script [`tutorials/mixtureProperties.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/mixtureProperties.py) calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). +This repository includes multiple tutorials of ways to use FuelLib. We recommend starting with the basic tutorial, [`tutorials/basic.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/basic.py), which is documented at [https://natlabrockies.github.io/FuelLib/tutorials-basic.html](https://natlabrockies.github.io/FuelLib/tutorials-basic.html). The script [`tutorials/mixtureProperties.py`](https://github.com/NatLabRockies/FuelLib/blob/main/tutorials/mixtureProperties.py) calculates a given mixture's density, viscosity and vapor pressure from GC x GC data. The results are plotted against data from NIST and [Edwards (2020)](https://apps.dtic.mil/sti/pdfs/AD1093317.pdf). ### Command-Line Tools -After installing FuelLib using one of the methods above, you have access to several command-line tools: - -#### Exporters -Export fuel properties for CFD simulations: - -- `fl-export-pele`: Export fuel properties for PelePhysics simulations -- `fl-export-converge`: Export fuel properties for Converge simulations - -Example: -```bash -fl-export-pele -f posf10264 -fl-export-converge -f posf10325 -``` - -Run `fl-export-pele -h` or `fl-export-converge -h` for detailed usage information. - -#### Utilities -Utility functions for combustion simulations: - -**Temperature Conversion:** -- `fl-C2K`: Convert temperature from Celsius to Kelvin -- `fl-K2C`: Convert temperature from Kelvin to Celsius - ```bash - fl-C2K 25.0 - # Output: 25.0 °C = 298.15 K - fl-K2C 373.15 - # Output: 373.15 K = 100.00 °C - ``` - -**Transport Properties:** -- `fl-eps2K`: Convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (for CHEMKIN chemical mechanisms) - ```bash - fl-eps2K 4066.75 - # Output: Characteristic temperature: 489.118 K - ``` - -**Available Fuels:** -- `fl-fuels`: List all available fuels in the library (built-in and custom) - ```bash - fl-fuels # Simple list - fl-fuels -v # Detailed listing with metadata - fl-fuels -dir path/to/custom/fuelData # List custom fuels - ``` - -**Analysis & Visualization:** - -- `fl-plt-comp`: Plot fuel composition by compound and chemical family - ```bash - fl-plt-comp -f posf10264 - ``` - -- `fl-plt-props`: Plot mixture properties (density, viscosity, vapor pressure, surface tension, thermal conductivity) vs. temperature - ```bash - fl-plt-props -f posf10264 - fl-plt-props -f posf10264 posf10325 posf10289 # Multiple fuels - ``` +After installing FuelLib using one of the methods above, you have access to several command-line tools for plotting, unit conversion, and exporting fuel data. A comprehensive list is provided in the documentation at [https://natlabrockies.github.io/FuelLib/tutorials-cli.html](https://natlabrockies.github.io/FuelLib/tutorials-cli.html). # Contributing New contributions are always welcome! For detailed contribution guidelines, installation instructions, and development setup, see the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page in the documentation. diff --git a/docs/figures/composition_posf10325.png b/docs/figures/composition_posf10325.png new file mode 100644 index 0000000000000000000000000000000000000000..3aac230b2a4555e0f0a0f628bd824471154f6c1a GIT binary patch literal 180271 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 literal 0 HcmV?d00001 diff --git a/docs/figures/mixture_properties_posf10264_posf10325_posf10289.png b/docs/figures/mixture_properties_posf10264_posf10325_posf10289.png new file mode 100644 index 0000000000000000000000000000000000000000..b919f21df59ef0f2d46ee91427ce2b2acddcdb1d GIT binary patch literal 582758 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∨x&SOl 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 KlC8BX;J*OStRgW0 literal 0 HcmV?d00001 diff --git a/docs/tutorials-cli.rst b/docs/tutorials-cli.rst new file mode 100644 index 0000000..c863f46 --- /dev/null +++ b/docs/tutorials-cli.rst @@ -0,0 +1,94 @@ +Command-Line Interface (CLI) Tools +=================================== + +FuelLib provides command-line tools for plotting, unit conversion, and exporting fuel data. +For detailed usage of each tool, use the ``--help`` or ``-h`` flag with the command (e.g., ``fl-plt-comp --help``). + +Plotting +~~~~~~~~ + +The plotting CLI provides quick visualization of fuel composition and properties. The following commands are available: + +.. code-block:: bash + + fl-plt-comp -f FUEL_NAME [OPTIONS] # Plot composition + fl-plt-props -f FUEL_NAME [OPTIONS] # Plot properties vs temperature + +If experimental data is available for the fuel and it is properly linked in the ``fuel_metadata.yaml`` file, it will be included in the plots for comparison with GCM predictions. + +Examples: + +.. code-block:: bash + + fl-plt-comp -f posf10325 + fl-plt-props -f posf10264 posf10325 posf10289 + fl-plt-props -f my-fuel -dir customFuels/fuelData -p Density Viscosity -d + +The first two commands provide the following plots for the specified fuels: + +.. figure:: /figures/composition_posf10325.png + :width: 600pt + :align: center + + Compositional information of Jet A (POSF10325). + +.. figure:: /figures/mixture_properties_posf10264_posf10325_posf10289.png + :width: 600pt + :align: center + + Properties of conventional jet fuels JP-8 (POSF10264), Jet A (POSF10325), and JP-5 (POSF10289) against data from the Air Force Research Laboratory\ :footcite:p:`edwards_jet_2020`. Note that the data sets for thermal conductivity are very inconsistent, but they typically show linear decreases in thermal conductivity with temperature. + +Unit Conversion Tools +~~~~~~~~~~~~~~~~~~~~~~ + +**Temperature Conversion** + +.. code-block:: bash + + fl-C2K 25 # Celsius to Kelvin + fl-K2C 298.15 # Kelvin to Celsius + fl-C2F 25 # Celsius to Fahrenheit + fl-F2C 77 # Fahrenheit to Celsius + fl-F2K 77 # Fahrenheit to Kelvin + fl-K2F 298.15 # Kelvin to Fahrenheit + +**Lennard-Jones Parameters** + +Convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (for CHEMKIN chemical mechanisms): + +.. code-block:: bash + + fl-eps2K 1000 # epsilon (J/mol) to characteristic temperature (K) + +Fuel Management +~~~~~~~~~~~~~~~ + +Quick listing of available fuels: + +.. code-block:: bash + + fl-fuels # List fuels shipped with FuelLib + fl-fuels -dir customFuels # List custom fuels + +Export for CFD +~~~~~~~~~~~~~~ + +FuelLib provides exporters for generating fuel property files for use in CFD simulations. The following commands are available: + +.. code-block:: bash + + fl-export-pele -f FUEL_NAME [OPTIONS] # PelePhysics + fl-export-converge -f FUEL_NAME [OPTIONS] # CONVERGE + +Additional information and examples for using the exporters can be found in the `Exporting Properties for Pele `_ and `Exporting Properties for CONVERGE `_ tutorials. + +Developer Tools +~~~~~~~~~~~~~~~ + +Tools for development and documentation maintenance: + +.. code-block:: bash + + fl-build-docs # Build Sphinx documentation + fl-clean-docs # Clean generated documentation + fl-format # Format Python code with black diff --git a/docs/tutorials.rst b/docs/tutorials.rst index d7c1f9a..ba3b18d 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -7,6 +7,7 @@ This section provides tutorials on how to use the FuelLib library. :maxdepth: 4 tutorials-basic + tutorials-cli tutorials-custom-fuels tutorials-export-pele tutorials-export-converge diff --git a/fuellib/__init__.py b/fuellib/__init__.py index fcf40d8..bb81b59 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -37,6 +37,10 @@ "N_A", "C2K", "K2C", + "C2F", + "F2C", + "F2K", + "K2F", "mixing_rule", "droplet_volume", "droplet_mass", @@ -1205,6 +1209,54 @@ def K2C(T): return T - 273.15 +def C2F(T): + """ + Convert temperature from Celsius to Fahrenheit. + + :param T: Temperature in Celsius. + :type T: float or np.ndarray + :return: Temperature in Fahrenheit. + :rtype: float or np.ndarray + """ + return T * 9 / 5 + 32 + + +def F2C(T): + """ + Convert temperature from Fahrenheit to Celsius. + + :param T: Temperature in Fahrenheit. + :type T: float or np.ndarray + :return: Temperature in Celsius. + :rtype: float or np.ndarray + """ + return (T - 32) * 5 / 9 + + +def F2K(T): + """ + Convert temperature from Fahrenheit to Kelvin. + + :param T: Temperature in Fahrenheit. + :type T: float or np.ndarray + :return: Temperature in Kelvin. + :rtype: float or np.ndarray + """ + return C2K(F2C(T)) + + +def K2F(T): + """ + Convert temperature from Kelvin to Fahrenheit. + + :param T: Temperature in Kelvin. + :type T: float or np.ndarray + :return: Temperature in Fahrenheit. + :rtype: float or np.ndarray + """ + return C2F(K2C(T)) + + def mixing_rule(var_n, X, pseudo_prop="arithmetic"): """ Mixing rules for computing mixture properties. diff --git a/fuellib/utilities/plotting.py b/fuellib/utilities/plotting.py index c529473..0ddd43d 100644 --- a/fuellib/utilities/plotting.py +++ b/fuellib/utilities/plotting.py @@ -158,7 +158,6 @@ def determine_carbon_number(compound): ax1.set_ylabel("Weight %", fontsize=16) ax1.tick_params(axis="y", labelsize=14) ax1.grid(axis="y", alpha=0.3) - ax1.legend(fontsize=12, loc="upper left") # Plot 2: Pie chart of family composition # Only include families that have weight > 0 diff --git a/fuellib/utilities/temp_converter.py b/fuellib/utilities/temp_converter.py index 80e3be7..5d79a68 100644 --- a/fuellib/utilities/temp_converter.py +++ b/fuellib/utilities/temp_converter.py @@ -1,7 +1,7 @@ -"""Command-line tools to convert temperature between Celsius and Kelvin.""" +"""Command-line tools to convert temperatures.""" import sys -from .. import C2K, K2C +from .. import C2K, K2C, C2F, F2C, F2K, K2F def c2k_main(): @@ -34,3 +34,67 @@ def k2c_main(): except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") sys.exit(1) + + +def c2f_main(): + """Convert temperature from Celsius to Fahrenheit via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-C2F ") + print("\nConvert temperature from Celsius to Fahrenheit") + sys.exit(1) + + try: + temp_c = float(sys.argv[1]) + result = C2F(temp_c) + print(f"{temp_c} °C = {result:.2f} °F") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) + + +def f2c_main(): + """Convert temperature from Fahrenheit to Celsius via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-F2C ") + print("\nConvert temperature from Fahrenheit to Celsius") + sys.exit(1) + + try: + temp_f = float(sys.argv[1]) + result = F2C(temp_f) + print(f"{temp_f} °F = {result:.2f} °C") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) + + +def f2k_main(): + """Convert temperature from Fahrenheit to Kelvin via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-F2K ") + print("\nConvert temperature from Fahrenheit to Kelvin") + sys.exit(1) + + try: + temp_f = float(sys.argv[1]) + result = F2K(temp_f) + print(f"{temp_f} °F = {result:.2f} K") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) + + +def k2f_main(): + """Convert temperature from Kelvin to Fahrenheit via command line.""" + if len(sys.argv) != 2: + print("Usage: fl-K2F ") + print("\nConvert temperature from Kelvin to Fahrenheit") + sys.exit(1) + + try: + temp_k = float(sys.argv[1]) + result = K2F(temp_k) + print(f"{temp_k} K = {result:.2f} °F") + except ValueError: + print(f"Error: '{sys.argv[1]}' is not a valid number") + sys.exit(1) diff --git a/pyproject.toml b/pyproject.toml index f0744c2..e60b200 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,10 @@ fl-format = "fuellib.format_code:main" fl-eps2K = "fuellib.utilities.transport_props_converter:eps2K_main" fl-C2K = "fuellib.utilities.temp_converter:c2k_main" fl-K2C = "fuellib.utilities.temp_converter:k2c_main" +fl-C2F = "fuellib.utilities.temp_converter:c2f_main" +fl-F2C = "fuellib.utilities.temp_converter:f2c_main" +fl-F2K = "fuellib.utilities.temp_converter:f2k_main" +fl-K2F = "fuellib.utilities.temp_converter:k2f_main" fl-plt-comp = "fuellib.utilities.plotting:comp_main" fl-plt-props = "fuellib.utilities.plotting:props_main" fl-fuels = "fuellib.utilities.fuel_manager:list_fuels_main" From 25964d66d3ebec0a29ada27c1c8ef2a655efb73f Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 16:33:05 -0600 Subject: [PATCH 29/48] Fix error for Jet A --- fuellib/data/fuelData/fuel_metadata.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuellib/data/fuelData/fuel_metadata.yaml b/fuellib/data/fuelData/fuel_metadata.yaml index acf77f8..0eed452 100644 --- a/fuellib/data/fuelData/fuel_metadata.yaml +++ b/fuellib/data/fuelData/fuel_metadata.yaml @@ -75,7 +75,7 @@ fuels: source: Vozka et al. (2018) reference: https://doi.org/10.1021/acs.energyfuels.8b02787 description: Conventional Jet-A - decomp_name: jet-A + decomp_name: jet-a # Single Component Reference Fuels decane: From 6275a0b374d3e3ecdb038d4d1655b457dcea183b Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 16:34:57 -0600 Subject: [PATCH 30/48] Add temp converters to API contract --- tests/test_api.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 899f795..84fad52 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -44,6 +44,10 @@ def test_fuellib_module_api(self): expected = { "C2K": "(T)", "K2C": "(T)", + "C2F": "(T)", + "F2C": "(T)", + "F2K": "(T)", + "K2F": "(T)", "mixing_rule": "(var_n, X, pseudo_prop='arithmetic')", "droplet_volume": "(r)", "droplet_mass": "(fuel, r, Yi, T)", From 2da2de7dd2527d9f415c5999e6d09f88744d9e7f Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 17:13:16 -0600 Subject: [PATCH 31/48] Break up fuellib/__init__ --- docs/sourcecode.rst | 21 +- fuellib/__init__.py | 1299 +---------------- fuellib/{utilities => cli}/__init__.py | 0 .../fuel_manager.py => cli/_fuel_manager.py} | 0 fuellib/{utilities => cli}/plotting.py | 0 fuellib/{utilities => cli}/temp_converter.py | 0 .../transport_props_converter.py | 0 fuellib/constants.py | 7 + fuellib/conversions.py | 106 ++ fuellib/fuel.py | 1128 ++++++++++++++ fuellib/utilities.py | 67 + pyproject.toml | 22 +- tests/test_api.py | 21 +- 13 files changed, 1371 insertions(+), 1300 deletions(-) rename fuellib/{utilities => cli}/__init__.py (100%) rename fuellib/{utilities/fuel_manager.py => cli/_fuel_manager.py} (100%) rename fuellib/{utilities => cli}/plotting.py (100%) rename fuellib/{utilities => cli}/temp_converter.py (100%) rename fuellib/{utilities => cli}/transport_props_converter.py (100%) create mode 100644 fuellib/constants.py create mode 100644 fuellib/conversions.py create mode 100644 fuellib/fuel.py create mode 100644 fuellib/utilities.py diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index b6e0e29..b34b9cb 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -16,28 +16,31 @@ FuelLib File Organization - **gcmTableData:** directory that contains the pre-tabulated group contributions - **fuellib:** main package directory containing: - - ``FuelLib.py``: class for enabling GCM predictions + - ``fuel.py``: core :class:`fuel` class for Group Contribution Method calculations + - ``constants.py``: physical constants (Boltzmann, Avogadro) + - ``conversions.py``: temperature conversion functions and Lennard-Jones calculations + - ``utilities.py``: utility functions for mixture properties and droplet calculations + - ``_data_locator.py``: internal module for locating and validating fuel data directories - **exporters:** subpackage with CLI exporters for generating fuel properties - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) - ``pele.py``: exporter for PelePhysics simulations (CLI: ``fl-export-pele``) - - **utilities:** subpackage with CLI utility tools for data conversion and analysis + - **cli:** subpackage with command-line interface tools for data conversion and analysis - - ``transport_props_converter.py``: convert Lennard-Jones well depth from J/mol to characteristic temperature in Kelvin (CLI: ``fl-eps2K``) - - ``temp_converter.py``: convert temperature between Celsius and Kelvin (CLI: ``fl-C2K``, ``fl-K2C``) - - ``plotting.py``: plot fuel composition and mixture properties - - - ``plot_composition()``: plot fuel composition by compound and chemical family (CLI: ``fl-plt-comp``) - - ``plot_mixture_properties()``: plot mixture properties over temperature range with optional experimental data (CLI: ``fl-plt-props``) + - ``temp_converter.py``: temperature conversion utilities (CLI: ``fl-C2K``, ``fl-K2C``, ``fl-C2F``, ``fl-F2C``, ``fl-F2K``, ``fl-K2F``) + - ``transport_props_converter.py``: Lennard-Jones parameter conversion (CLI: ``fl-eps2K``) + - ``plotting.py``: plotting utilities for composition and properties (CLI: ``fl-plt-comp``, ``fl-plt-props``) + - ``_fuel_manager.py``: fuel manager utility (CLI: ``fl-fuels``) - **tests:** directory containing CI unit tests for FuelLib. The CI test checks if the cumulative error of property predictions of a new proposed model are less than or equal to the current model. - **baselinePredictions:** directory that contains baseline predictions and script ``generate_baseline.py`` for generating baseline predictions for CI testing. - ``test_accuracy.py``: unit test used in CI for verifying new model predictions preserve accuracy - ``test_source_docstrings.py``: documentation contract test that checks public source functions include required docstring fields (``:param:``, ``:type:``, ``:return:``, ``:rtype:``). - - ``test_api.py``: combined API/signature and function-evaluation test that checks public ``FuelLib.py`` module and class method signatures for unexpected API drift and runs representative FuelLib smoke evaluations. + - ``test_api.py``: combined API/signature and function-evaluation test that checks public fuellib module and class method signatures for unexpected API drift and runs representative FuelLib smoke evaluations. - ``test_utilities.py``: unit test for utility functions and CLI commands including temperature conversion and transport property calculations. + - ``test_hc_identification.py``: unit test for hydrocarbon classification logic. - ``get_pred_and_data.py``: helper function used by ``test_accuracy.py`` and ``baselinePredictions/generate_baseline.py`` to compute predictions and load validation data. - **tutorials:** directory containing example scripts that demonstrate how to use FuelLib diff --git a/fuellib/__init__.py b/fuellib/__init__.py index bb81b59..96b95cb 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -3,12 +3,9 @@ FuelLib utilizes the Group Contribution Method (GCM) as proposed by Constantinou and Gani (1994, 1995) to calculate thermodynamic and mixture properties of fuels. -""" -import os -import numpy as np -import pandas as pd -from scipy.optimize import curve_fit +See :class:`fuel` for the main class and complete API documentation. +""" try: from importlib.metadata import version @@ -17,8 +14,28 @@ except Exception: __version__ = "unknown" +# Import constants +from .constants import k_B, N_A + +# Import temperature conversions and characteristic temperature +from .conversions import ( + C2K, + K2C, + C2F, + F2C, + F2K, + K2F, + epsilon_to_characteristic_temperature, +) + +# Import utility functions +from .utilities import mixing_rule, droplet_volume, droplet_mass + +# Import fuel class +from .fuel import fuel + +# Import data locator functions from ._data_locator import ( - get_gcmtable_dir, get_fueldata_dir, get_fueldata_gc_dir, get_fueldata_decomp_dir, @@ -27,10 +44,6 @@ get_props_data_from_metadata, ) -# Physical constants -k_B = 1.380649e-23 # Boltzmann's constant in J/K -N_A = 6.02214076e23 # Avogadro's number in 1/mol - __all__ = [ "fuel", "k_B", @@ -41,10 +54,10 @@ "F2C", "F2K", "K2F", + "epsilon_to_characteristic_temperature", "mixing_rule", "droplet_volume", "droplet_mass", - "epsilon_to_characteristic_temperature", "get_fueldata_dir", "get_fueldata_gc_dir", "get_fueldata_decomp_dir", @@ -52,1267 +65,3 @@ "get_decomp_name_from_metadata", "get_props_data_from_metadata", ] - - -class fuel: - """ - Class for handling group contribution calculations of thermodynamic and mixture properties. - - :param name: Name of the mixture as it appears in its gcData file. - :type name: str - :param decompName: Name of the groupDecomposition file if different from name. Defaults to None. - :type decompName: str, optional - :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. - :type fuelDataDir: str, optional - - **Data Directory Attributes:** - - :ivar fuelDataDir: Root directory for fuel data (custom or embedded). - :ivar fuelDataGcDir: Directory containing GCxGC compositional data files. - :ivar fuelDataDecompDir: Directory containing functional group decomposition files. - :ivar fuelDataPropsDir: Directory containing experimental property data (may be None). - - **Composition Attributes:** - - :ivar name: Name of the fuel/mixture. - :ivar compounds: List of compound names in the mixture. - :ivar formulas: Molecular formulas for each compound (if available). - :ivar Y_0: Mass fractions of each compound (array, shape: num_compounds). - :ivar Nij: Functional group decomposition matrix (array, shape: num_compounds × num_groups). - :ivar num_compounds: Number of compounds in the mixture. - :ivar num_groups: Number of functional groups in the decomposition. - - **Pure Component Properties (Critical, Molecular):** - - :ivar MW: Molecular weights in kg/mol (array, shape: num_compounds). - :ivar Tc: Critical temperatures in K (array, shape: num_compounds). - :ivar Pc: Critical pressures in Pa (array, shape: num_compounds). - :ivar Vc: Critical volumes in m³/mol (array, shape: num_compounds). - :ivar Tb: Boiling temperatures in K (array, shape: num_compounds). - :ivar Tm: Melting temperatures in K (array, shape: num_compounds). - - **Thermodynamic Properties (at 298.15 K):** - - :ivar Hf: Enthalpy of formation in J/mol (array, shape: num_compounds). - :ivar Gf: Gibbs free energy in J/mol (array, shape: num_compounds). - :ivar Hv_stp: Enthalpy of vaporization at 298 K in J/mol (array, shape: num_compounds). - :ivar Lv_stp: Latent heat of vaporization at 298 K in J/kg (array, shape: num_compounds). - :ivar Cp_stp: Molar specific heat at 298 K in J/mol/K (array, shape: num_compounds). - :ivar Vm_stp: Molar liquid volume at 298 K in m³/mol (array, shape: num_compounds). - :ivar omega: Acentric factors (array, shape: num_compounds). - - **Lennard-Jones Transport Parameters:** - - :ivar sigma: Lennard-Jones collision diameters in m (array, shape: num_compounds). - :ivar epsilonByKB: Lennard-Jones well depths in K (array, shape: num_compounds). - - **Classification Attributes:** - - :ivar hc_type: Hydrocarbon types ("n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene"). - :ivar fam: Family codes for thermal conductivity (0: saturated, 1: aromatic, 2: cycloparaffin, 3: olefin). - :ivar nC: Carbon numbers (array, shape: num_compounds). - :ivar nH: Hydrogen numbers (array, shape: num_compounds). - - **Optional Attributes:** - - :ivar pelephysics_keys: PelePhysics keys for each compound (if available). - """ - - # Number of first and second order groups from Constantinou and Gani - N_g1 = 78 - N_g2 = 43 - - def __init__(self, name, decompName=None, fuelDataDir=None): - """ - Initialize the fuel object and calculate GCM properties. - - :param name: Name of the mixture as it appears in its gcData file. - :type name: str - :param decompName: Name of the groupDecomposition file if different from name. - :type decompName: str, optional - :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. - :type fuelDataDir: str, optional - """ - - self.name = name - if decompName is None: - # Try to get decomposition name from metadata - decompName = get_decomp_name_from_metadata(name, fuelDataDir) - - # Determine and set data directories for this fuel instance - if fuelDataDir is None: - # Use built-in embedded data - self.fuelDataDir = get_fueldata_dir() - self.fuelDataGcDir = get_fueldata_gc_dir() - self.fuelDataDecompDir = get_fueldata_decomp_dir() - self.fuelDataPropsDir = get_fueldata_props_dir() - else: - # Validate and use custom fuel directory - from ._data_locator import ( - _validate_fuel_data_dir, - _get_props_dir_for_fueldata, - ) - - _validate_fuel_data_dir(fuelDataDir) - self.fuelDataDir = fuelDataDir - self.fuelDataGcDir = os.path.join(fuelDataDir, "gcData") - self.fuelDataDecompDir = os.path.join(fuelDataDir, "groupDecompositionData") - self.fuelDataPropsDir = _get_props_dir_for_fueldata(fuelDataDir) - - # Get GCM table directory (always from built-in data) - gcmtable_dir = get_gcmtable_dir() - - self.groupDecompFile = os.path.join(self.fuelDataDecompDir, f"{decompName}.csv") - self.gcxgcFile = os.path.join(self.fuelDataGcDir, f"{name}_init.csv") - self.gcmTableFile = os.path.join(gcmtable_dir, "gcmTable.csv") - - # Read functional group data for mixture (num_compounds,num_groups) - df_Nij = pd.read_csv(self.groupDecompFile) - self.Nij = df_Nij.iloc[:, 1:].to_numpy() - self.num_compounds = self.Nij.shape[0] - self.num_groups = self.Nij.shape[1] - - # Classify hydrocarbon by family (used in thermal conductivity) - # 0: saturated hydrocarbons - # 1: aromatics - # 2: cycloparaffins - # 3: olefins - self.fam = np.zeros(self.num_compounds, dtype=int) - - # Classify hydrocarbon by type (n-alkane, iso-alkane, cyclo-alkane, aromatic) - # Based on group decompositions from Constantinou-Gani method - self.hc_type = np.array([""] * self.num_compounds, dtype=object) - - aromatics = 10 # starting index for aromatic groups - num_aromatics = 5 - branching = 78 # starting index for branching groups (Group j (CH3)2CH through C(CH3)2C(CH3)2) - num_branching = 5 # groups 78-82 inclusive - cyclos = 83 # starting index for membered ring groups (3-7 membered rings) - num_cyclos = 5 - olefins = 4 # starting index for double bound groups - num_olefins = 6 - - for i in range(self.num_compounds): - # Check if aromatic: does it contain AC's? - if sum(self.Nij[i, aromatics : aromatics + num_aromatics]) > 0: - self.fam[i] = 1 - self.hc_type[i] = "aromatic" - # Check if cycloparaffin: does it contain rings? - elif sum(self.Nij[i, cyclos : cyclos + num_cyclos]) > 0: - self.fam[i] = 2 - self.hc_type[i] = "cyclo-alkane" - # Check if olefin: does it contain double bonds? - elif sum(self.Nij[i, olefins : olefins + num_olefins]) > 0: - self.fam[i] = 3 - self.hc_type[i] = "alkene" - # Check for branching groups (CH, C quaternary carbons) - elif sum(self.Nij[i, branching : branching + num_branching]) > 0: - self.hc_type[i] = "iso-alkane" - else: - # Only CH3 and CH2 -> n-alkane (linear) - self.hc_type[i] = "n-alkane" - - # Calculate carbon and hydrogen numbers from first-order group decomposition - # For jet fuels, use only alkyl (0-3) and aromatic (10-14) groups - # Alkyl: CH3=1C,3H; CH2=1C,2H; CH=1C,1H; C=1C,0H - # Aromatic: ACH=1C,1H; AC=1C,0H; ACCH3=2C,3H; ACCH2=2C,2H; ACCH=2C,1H - alkyl_carbons = np.array([1, 1, 1, 1]) # groups 0-3 - alkyl_hydrogens = np.array([3, 2, 1, 0]) - # Olefinic: group 4 appears to represent 2 carbons with 3 hydrogens in UNIFAC-based system - olefinic_carbons = np.array([2, 1, 1, 0, 0, 0]) # groups 4-9 - olefinic_hydrogens = np.array([3, 1, 0, 0, 0, 0]) - aromatic_carbons = np.array([1, 1, 2, 2, 2]) # groups 10-14 - aromatic_hydrogens = np.array([1, 0, 3, 2, 1]) - - self.nC = np.zeros(self.num_compounds, dtype=float) - self.nH = np.zeros(self.num_compounds, dtype=float) - for i in range(self.num_compounds): - # Alkyl contribution (groups 0-3) - self.nC[i] = np.dot(self.Nij[i, 0:4], alkyl_carbons) - self.nH[i] = np.dot(self.Nij[i, 0:4], alkyl_hydrogens) - # Olefinic contribution (groups 4-9) - self.nC[i] += np.dot(self.Nij[i, 4:10], olefinic_carbons) - self.nH[i] += np.dot(self.Nij[i, 4:10], olefinic_hydrogens) - # Aromatic contribution (groups 10-14) - self.nC[i] += np.dot(self.Nij[i, 10:15], aromatic_carbons) - self.nH[i] += np.dot(self.Nij[i, 10:15], aromatic_hydrogens) - - # Read GCxGC/compound data - df_gcxgc = pd.read_csv(self.gcxgcFile) - - self.compounds = [ - compound.strip() for compound in df_gcxgc["Compound"].to_list() - ] - - # Load molecular formulas if available - if "Formula" in df_gcxgc.columns: - self.formulas = [ - formula.strip() if pd.notna(formula) else None - for formula in df_gcxgc["Formula"].to_list() - ] - else: - self.formulas = None - - if "PelePhysics Key" in df_gcxgc.columns: - self.pelephysics_keys = [ - key.strip() for key in df_gcxgc["PelePhysics Key"].to_list() - ] - else: - self.pelephysics_keys = None - - self.Y_0 = df_gcxgc["Weight %"].to_numpy().flatten().astype(float) - self.Y_0 /= np.sum(self.Y_0) - - # Make sure mixture data is consistent: - if self.num_groups < self.N_g1: - raise ValueError( - f"Insufficient mixture description:\n" - f"The number of columns in {self.groupDecompFile} is less than " - f"the required number of first-order groups (N_g1 = {self.N_g1})." - ) - if self.Y_0.shape[0] != self.num_compounds: - raise ValueError( - f"Insufficient mixture description:\n" - f"The number of compounds in {self.groupDecompFile} does not " - f"equal the number of compounds in {self.gcxgcFile}." - ) - - # Read and store GCM table properties - df_table = pd.read_csv(self.gcmTableFile) - df_table = df_table.drop(columns=["Units"]) - - def get_row(property_name): - """ - Get property row from GCM table. - - :param property_name: Name of the property to retrieve. - :type property_name: str - :return: Property values for all functional groups. - :rtype: np.ndarray - :raises ValueError: If property not found in GCM table. - """ - row = df_table[df_table["Property"] == property_name] - if row.empty: - raise ValueError(f"Property '{property_name}' not found in GCM table.") - return row.iloc[:, 1:].to_numpy().flatten() - - # Table data for functional groups (num_compounds,) - Tck = get_row("tck") # critical temperature (1) - Pck = get_row("pck") # critical pressure (bar) - Vck = get_row("vck") # critical volume (m^3/kmol) - Tbk = get_row("tbk") # boiling temperature (1) - Tmk = get_row("tmk") # melting point temperature (1) - hfk = get_row("hfk") # enthalpy of formation, (kJ/mol) - gfk = get_row("gfk") # Gibbs energy (kJ/mol) - hvk = get_row("hvk") # latent heat of vaporization (kJ/mol) - wk = get_row("wk") # accentric factor (1) - Vmk = get_row("vmk") # liquid molar volume fraction (m^3/kmol) - cpak = get_row("CpAk") # specific heat values (J/mol/K) - cpbk = get_row("CpBk") # specific heat values (J/mol/K) - cpck = get_row("CpCk") # specific heat values (J/mol/K) - mwk = get_row("MW") # molecular weights (g/mol) - - # --- Compute critical properties at standard temp (num_compounds,) - # Molecular weights - self.MW = np.matmul(self.Nij, mwk) # g/mol - self.MW *= 1e-3 # Convert to kg/mol - - # T_c (critical temperature) - self.Tc = 181.128 * np.log(np.matmul(self.Nij, Tck)) # K - - # p_c (critical pressure) - self.Pc = 1.3705 + (np.matmul(self.Nij, Pck) + 0.10022) ** (-2) # bar - self.Pc *= 1e5 # Convert to Pa from bar - - # V_c (critical volume) - self.Vc = -0.00435 + (np.matmul(self.Nij, Vck)) # m^3/kmol - self.Vc *= 1e-3 # Convert to m^3/mol - - # T_b (boiling temperature) - self.Tb = 204.359 * np.log(np.matmul(self.Nij, Tbk)) # K - - # T_m (melting temperature) - self.Tm = 102.425 * np.log(np.matmul(self.Nij, Tmk)) # K - - # H_f (enthalpy of formation) - self.Hf = 10.835 + np.matmul(self.Nij, hfk) # kJ/mol - self.Hf *= 1e3 # Convert to J/mol - - # G_f (Gibbs free energy) - self.Gf = -14.828 + np.matmul(self.Nij, gfk) # kJ/mol - self.Gf *= 1e3 # Convert to J/mol - - # H_v,stp (enthalpy of vaporization at 298 K) - self.Hv_stp = 6.829 + (np.matmul(self.Nij, hvk)) # kJ/mol - self.Hv_stp *= 1e3 # Convert to J/mol - - # omega (accentric factor) - self.omega = 0.4085 * np.log(np.matmul(self.Nij, wk) + 1.1507) ** (1.0 / 0.5050) - - # V_m (molar liquid volume at 298 K) - self.Vm_stp = 0.01211 + np.matmul(self.Nij, Vmk) # m^3/kmol - self.Vm_stp *= 1e-3 # Convert to m^3/mol - - # C_p,stp (molar specific heat at 298 K) - self.Cp_stp = np.matmul(self.Nij, cpak) - 19.7779 # J/mol/K - - # Temperature corrections for C_p - self.Cp_B = np.matmul(self.Nij, cpbk) - self.Cp_C = np.matmul(self.Nij, cpck) - - # L_v,stp (latent heat of vaporization at 298 K) - self.Lv_stp = self.Hv_stp / self.MW # J/kg - - # Lennard-Jones parameters for diffusion calculations (Tee et al. 1966) - self.epsilonByKB = (0.7915 + 0.1693 * self.omega) * self.Tc # K - Pc_atm = self.Pc / 101325 # atm - self.sigma = (2.3551 - 0.0874 * self.omega) * (self.Tc / Pc_atm) ** ( - 1.0 / 3 - ) # Angstroms - self.sigma *= 1e-10 # Convert from Angstroms to m - - # ------------------------------------------------------------------------- - # Member functions - # ------------------------------------------------------------------------- - def mean_molecular_weight(self, Yi): - """ - Calculate the mean molecular weight of the mixture. - - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :return: Mean molecular weight of the mixture in kg/mol. - :rtype: float - """ - if np.sum(Yi) != 0: - Mbar = 1 / np.sum(Yi / self.MW) # mean molar weight of the mixture - else: - Mbar = 0.0 - - return Mbar - - def mass2Y(self, mass): - """ - Calculate the mass fractions from the mass of each component. - - :param mass: Mass of each compound. - :type mass: np.ndarray - :return: Mass fractions of the compounds (shape: num_compounds,). - :rtype: np.ndarray - """ - # Normalize to get group mole fractions - total_mass = np.sum(mass) - if total_mass != 0: - Yi = mass / total_mass - else: - Yi = np.zeros_like(self.MW) - - return Yi - - def mass2X(self, mass): - """ - Calculate the mole fractions from the mass of each component. - - :param mass: Mass of each compound. - :type mass: np.ndarray - :return: Mass fractions of the compounds (shape: num_compounds,). - :rtype: np.ndarray - """ - # Calculate the number of moles for each compound - num_mole = mass / self.MW - - # Normalize to get group mole fractions - total_moles = np.sum(num_mole) - if total_moles != 0: - Xi = num_mole / total_moles - else: - Xi = np.zeros_like(self.MW) - - return Xi - - def X2Y(self, Xi): - """ - Calculate the mass fractions from the mole fractions of each component. - - :param Xi: Mole fractions of each compound. - :type Xi: np.ndarray - :return: Mass fractions of the compounds (shape: num_compounds,). - :rtype: np.ndarray - """ - # Calculate the mass for each compound - mass = Xi * self.MW - - # Normalize to get group mass fractions - total_mass = np.sum(mass) - if total_mass != 0: - Yi = mass / total_mass - else: - Yi = np.zeros_like(self.MW) - - return Yi - - def Y2X(self, Yi): - """ - Calculate the mole fractions from the mass fractions of each component. - - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :return: Mole fractions of the compounds (shape: num_compounds,). - :rtype: np.ndarray - """ - Mbar = self.mean_molecular_weight(Yi) - if np.sum(Yi) != 0: - Xi = Mbar * Yi / self.MW - else: - Xi = np.zeros_like(self.MW) - - return Xi - - def density(self, T, comp_idx=None): - """ - Calculate the density of each component at temperature T. - - :param T: Temperature of the mixture in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Density of each compound in kg/m^3. - :rtype: np.ndarray - """ - if comp_idx is None: - MW = self.MW # kg/mol - Vm = self.molar_liquid_vol(T) # m^3/mol - else: - MW = self.MW[comp_idx] # kg/mol - Vm = self.molar_liquid_vol(T, comp_idx=comp_idx) # m^3/mol - - rho = MW / Vm # kg/m^3 - return rho - - def viscosity_kinematic(self, T, comp_idx=None): - """ - Calculate the viscosity using Dutt's equation. - - :meta private: This uses Dutt's equation (4.23) from "Viscosity of Liquids". - :meta private: The equation predicts viscosity in mm^2/s and is converted to SI units. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Viscosity of each component in m^2/s. - :rtype: np.ndarray - """ - - # Convert temperature to Celsius - T_cels = K2C(T) - if comp_idx is None: - Tb_cels = K2C(self.Tb) - else: - Tb_cels = K2C(self.Tb[comp_idx]) - - # RHS of Dutt's equation (4.23) in Viscosity of Liquids - rhs = -3.0171 + (442.78 + 1.6452 * Tb_cels) / (T_cels + 239 - 0.19 * Tb_cels) - nu_i = np.exp(rhs) # Viscosity in mm^2/s - - # Convert to SI (m^2/s) - nu_i = nu_i * 1e-6 - - return nu_i - - def viscosity_dynamic(self, T, comp_idx=None): - """ - Calculate liquid dynamic viscosity based on droplet temperature and density. - - :meta private: Uses Dutt's equation (4.23) for kinematic viscosity, combined with density. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Dynamic viscosity in Pa*s. - :rtype: np.ndarray - """ - - nu_i = self.viscosity_kinematic(T, comp_idx=comp_idx) # m^2/s - rho_i = self.density(T, comp_idx=comp_idx) # kg/m^3 - mu_i = nu_i * rho_i # Pa*s - return mu_i - - def Cp(self, T, comp_idx=None): - """ - Compute molar specific heat capacity at a given temperature. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Molar specific heat capacity in J/mol/K. - :rtype: np.ndarray - """ - - theta = (T - 298) / 700 - if comp_idx is None: - Cp_stp = self.Cp_stp - Cp_B = self.Cp_B - Cp_C = self.Cp_C - else: - Cp_stp = self.Cp_stp[comp_idx] - Cp_B = self.Cp_B[comp_idx] - Cp_C = self.Cp_C[comp_idx] - - cp = Cp_stp + Cp_B * theta + Cp_C * theta**2 - - return cp - - def Cl(self, T, comp_idx=None): - """ - Compute liquid mass specific heat capacity in J/kg/K at a given temperature. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Mass specific heat capacity in J/kg/K. - :rtype: np.ndarray - """ - if comp_idx is None: - MW = self.MW - else: - MW = self.MW[comp_idx] - cp = self.Cp(T, comp_idx=comp_idx) - return cp / MW - - def psat(self, T, comp_idx=None, correlation="Lee-Kesler"): - """ - Compute saturated vapor pressure. - - :meta private: Can use Ambrose-Walton or Lee-Kesler correlations (default Lee-Kesler). - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). - :type correlation: str, optional - :return: Saturated vapor pressure in Pa. - :rtype: np.ndarray - """ - - if comp_idx is None: - Tr = T / self.Tc - Pc = self.Pc - omega = self.omega - else: - Tr = T / self.Tc[comp_idx] - Pc = self.Pc[comp_idx] - omega = self.omega[comp_idx] - - if correlation.casefold() == "Ambrose-Walton".casefold(): - # May cause trouble at high temperatures - tau = 1 - Tr - f0 = ( - -5.97616 * tau - + 1.29874 * tau**1.5 - - 0.60394 * tau**2.5 - - 1.06841 * tau**5.0 - ) - f0 /= Tr - f1 = ( - -5.03365 * tau - + 1.11505 * tau**1.5 - - 5.41217 * tau**2.5 - - 7.46628 * tau**5.0 - ) - f1 /= Tr - f2 = ( - -0.64771 * tau - + 2.41539 * tau**1.5 - - 4.26979 * tau**2.5 - - 3.25259 * tau**5.0 - ) - f2 /= Tr - rhs = np.exp(f0 + omega * f1 + omega**2 * f2) - - else: # Default correlation is Lee-Kesler - f0 = 5.92714 - (6.09648 / Tr) - 1.28862 * np.log(Tr) + 0.169347 * (Tr**6) - f1 = 15.2518 - (15.6875 / Tr) - 13.4721 * np.log(Tr) + 0.43577 * (Tr**6) - rhs = np.exp(f0 + omega * f1) - - psat = Pc * rhs - return psat - - def psat_antoine_coeffs(self, Tvals=None, units="mks", correlation="Lee-Kesler"): - """ - Estimate Antoine coefficients for vapor pressure of an individual compound. - - :param Tvals: Temperature range or nodes for Antoine fit in Kelvin (default [273.15, Tb_i]). - :type Tvals: np.ndarray, optional - :param units: Units for pressure in fit ("mks", "cgs", "bar", "atm") - :type units: str, optional - :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). - :type correlation: str, optional - :return: Coefficients A, B, C, D - :rtype: 4 np.ndarrays - """ - - # Define or get temperature nodes for fit - if Tvals is None: - print("Tvals not specified, using [273.15, Tb_i] for each compound.") - # Initialize as zeros for now, calculated for each compound later - T = np.zeros(20) - elif len(Tvals) == 2: - T = np.linspace(Tvals[0], Tvals[1], 20) - elif len(Tvals) > 2: - T = Tvals - else: - raise ValueError("Tvals must be None, length 2, or length > 2.") - - # Antoine equation log10(p) = A - B/(C + T) - def antoine_eq(T, A, B, C): - """Antoine equation for vapor pressure.""" - return A - B / (T + C) - - # Determine conversion factor for pressure in MKS, CGS, bar, or atm - D = 1 # default is Pa - if units.lower() == "bar": - D = 1e5 - elif units.lower() == "atm": - D = 1.01325e5 - elif units.lower() == "cgs": - D = 1 / 10 # dyne/cm^2 - - # Fit Antoine coefficients for each compound - A = np.zeros(self.num_compounds) - B = np.zeros(self.num_compounds) - C = np.zeros(self.num_compounds) - for i in range(self.num_compounds): - # Update T if not specified - if Tvals is None: - T = np.linspace(273.15, self.Tb[i], 20) - Pvals = np.zeros_like(T) - for k in range(len(T)): - Pvals[k] = 1 / D * self.psat(T[k], correlation=correlation)[i] - - logP = np.log10(Pvals) - popt, _ = curve_fit(antoine_eq, T, logP, p0=[1, 1e3, -1]) - A[i], B[i], C[i] = popt - D = D + np.zeros(self.num_compounds) # make D an array - return A, B, C, D - - def molar_liquid_vol(self, T, comp_idx=None): - """ - Compute molar liquid volume with temperature correction. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Molar liquid volume in m^3/mol. - :rtype: np.ndarray - """ - - Tstp = 298.0 - if comp_idx is None: - Tc = self.Tc - omega = self.omega - Vm_stp = self.Vm_stp - else: - Tc = np.array([self.Tc[comp_idx]]) - omega = np.array([self.omega[comp_idx]]) - Vm_stp = np.array([self.Vm_stp[comp_idx]]) - phi = np.zeros_like(Tc) - for i in range(len(Tc)): - if T > Tc[i]: - phi[i] = -((1 - (Tstp / Tc[i])) ** (2.0 / 7.0)) - else: - phi[i] = ((1 - (T / Tc[i])) ** (2.0 / 7.0)) - ( - (1 - (Tstp / Tc[i])) ** (2.0 / 7.0) - ) - z = 0.29056 - 0.08775 * omega - Vmi = Vm_stp * np.power(z, phi) - if comp_idx is not None: - Vmi = Vmi[0] - return Vmi - - def latent_heat_vaporization(self, T, comp_idx=None): - """ - Calculate latent heat of vaporization adjusted for temperature. - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Latent heat of vaporization in J/kg. - :rtype: np.ndarray - """ - if comp_idx is None: - Tc = self.Tc - Tb = self.Tb - Lv_stp = self.Lv_stp - else: - Tc = np.array([self.Tc[comp_idx]]) - Tb = np.array([self.Tb[comp_idx]]) - Lv_stp = np.array([self.Lv_stp[comp_idx]]) - - # Reduced temperatures - Tr = T / Tc - Trb = Tb / Tc - - Lvi = np.zeros_like(Tc) - for i in range(len(Tc)): - if T > Tc[i]: - Lvi[i] = 0.0 - else: - Lvi[i] = Lv_stp[i] * (((1.0 - Tr[i]) / (1.0 - Trb[i])) ** 0.38) - - if comp_idx is not None: - Lvi = Lvi[0] - return Lvi - - def diffusion_coeff( - self, - p, - T, - sigma_gas=3.62e-10, - epsilonByKB_gas=97.0, - MW_gas=28.97e-3, - correlation="Tee", - ): - """ - Compute diffusion coefficients using Lennard-Jones parameters. - - :meta private: Uses Wilke and Lee method (Poling, equation 11-4.1). - :meta private: Ambient gas defaults to air parameters. - - :param p: Pressure in Pa. - :type p: float - :param T: Temperature in Kelvin. - :type T: float - :param sigma_gas: Collision diameter in m. - :type sigma_gas: float, optional - :param epsilonByKB_gas: Well depth over Boltzmann constant, in K. - :type epsilonByKB_gas: float, optional - :param MW_gas: Mean molecular weight of ambient gas in kg/mol. - :type MW_gas: float, optional - :param correlation: Method to calculate sigma and epsilon ("Tee" or "Wilke"). - :type correlation: str, optional - :return: Diffusion coefficient. - :rtype: np.ndarray - """ - - # Method of Tee for calculating liquid sigma and epsilon - if correlation.casefold() == "Tee".casefold(): - sigma_i = self.sigma * 1e10 # convert from m to Angstroms - epsilonByKB_i = self.epsilonByKB # K - else: - # Method of Wilke & Lee calculating liquid sigma and epsilon - Vmb_i = np.zeros_like(self.Tb) - for n in range(self.num_compounds): - Vmb_i[n] = self.molar_liquid_vol(self.Tb[n])[n] * 1e6 # cm^3/mol - sigma_i = 1.18 * Vmb_i ** (1 / 3) # Angstroms, Poling (11-4.2) - epsilonByKB_i = 1.15 * self.Tb # K , Poling (11-4.3) - - # Compute binary sigma and epsilon - sigma_gas = sigma_gas * 1e10 # convert from m to Angstroms - sigmaAB_i = (sigma_gas + sigma_i) / 2 # Angstroms, Poling (11-3.5) - epsilonAB_byKB_i = ( - epsilonByKB_gas * epsilonByKB_i - ) ** 0.5 # K, Poling (11-3.4) - - # Dimensionless collision integral for diffusion: Poling (11-3.6) - Tstar_i = T / epsilonAB_byKB_i # [1] - A = 1.06036 - B = 0.15610 - C = 0.193 - D = 0.47635 - E = 1.03587 - F = 1.52996 - G = 1.76474 - H = 3.89411 - omegaD_i = ( - A / (Tstar_i**B) - + C / np.exp(D * Tstar_i) - + E / np.exp(F * Tstar_i) - + G / np.exp(H * Tstar_i) - ) - - # Convert molecular weights from kg/mol to g/mol then calculate M_AB - MW_gas = MW_gas * 1e3 - MW_i = self.MW * 1e3 - M_AB_i = 2 * (MW_i * MW_gas) / (MW_i + MW_gas) # g/mol, see Poling (11-3.1) - - # Convert pressure from Pa to bar - p = p * 1e-5 # bar - - # Binary diffusion coefficients, Poling (11-4.1) - D_AB_i = ( - 1e-3 - * (3.03 - 0.98 / (M_AB_i**0.5)) - * (T**1.5) - / (p * M_AB_i**0.5 * sigmaAB_i**2 * omegaD_i) - ) # cm^2/s - D_AB_i = D_AB_i * 1e-4 # Convert to m^2/s - - return D_AB_i - - def surface_tension(self, T, comp_idx=None, correlation="Brock-Bird"): - """ - Calculate surface tension of each compound at a given temperature. - - :meta private: Uses Brock-Bird (default) or Pitzer correlations (Poling 12-3.5, 12-3.7). - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :param correlation: Correlation method ("Brock-Bird" or "Pitzer"). - :type correlation: str, optional - :return: Surface tension in N/m. - :rtype: np.ndarray - """ - if comp_idx is None: - Tc = self.Tc - Pc = self.Pc - Tb = self.Tb - omega = self.omega - else: - Tc = np.array([self.Tc[comp_idx]]) - Pc = np.array([self.Pc[comp_idx]]) - Tb = np.array([self.Tb[comp_idx]]) - omega = np.array([self.omega[comp_idx]]) - Tr = T / Tc - Pc = Pc * 1e-5 # convert from Pa to bar - - if correlation.casefold() == "Brock-Bird".casefold(): - Tbr = Tb / Tc - Q = 0.1196 * (1.0 + (Tbr * np.log(Pc / 1.01325)) / (1.0 - Tbr)) - 0.279 - else: - w = omega - Q = ( - (1.86 + 1.18 * w) - / 19.05 - * (((3.75 + 0.91 * w) / (0.291 - 0.08 * w)) ** (2.0 / 3.0)) - ) - - st = Pc ** (2.0 / 3.0) * Tc ** (1.0 / 3.0) * Q * (1 - Tr) ** (11.0 / 9.0) - - st = st * 1e-3 # Convert from dyn/cm to N/m - if comp_idx is not None: - st = st[0] - - return st - - def thermal_conductivity(self, T, comp_idx=None): - """ - Calculate thermal conductivity at a given temperature. - - :meta private: Uses Latini et al. method (Poling equation 10-9.1). - - :param T: Temperature in Kelvin. - :type T: float - :param comp_idx: Index of compound to calculate property for. - :type comp_idx: int, optional - :return: Thermal conductivity in W/m/K. - :rtype: np.ndarray - """ - if comp_idx is None: - MW = self.MW - Tc = self.Tc - Tb = self.Tb - fam = self.fam - else: - MW = np.array([self.MW[comp_idx]]) - Tc = np.array([self.Tc[comp_idx]]) - Tb = np.array([self.Tb[comp_idx]]) - fam = np.array([self.fam[comp_idx]]) - - Astar = 0.00350 + np.zeros_like(Tc) - alpha = 1.2 - beta = 0.5 + np.zeros_like(Tc) - gamma = 0.167 - MW_beta = MW * 1e3 # convert from kg/mol to g/mol - Tr = T / Tc - - for i in range(len(Tc)): - if fam[i] == 1: - # Aromatics - Astar[i] = 0.0346 - beta[i] = 1.0 - elif fam[i] == 2: - # Cycloparaffins - Astar[i] = 0.0310 - beta[i] = 1.0 - elif fam[i] == 3: - # Olefins - Astar[i] = 0.0361 - beta[i] = 1.0 - MW_beta[i] = MW_beta[i] ** beta[i] - - A = Astar * Tb**alpha / (MW_beta * Tc**gamma) - tc = A * (1 - Tr) ** (0.38) / (Tr ** (1 / 6)) - - if comp_idx is not None: - tc = tc[0] - return tc - - # --- Mixture functions --- - def mixture_density(self, Yi, T): - """ - Calculate mixture density at a given temperature. - - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :return: Mixture density in kg/m^3. - :rtype: float - """ - MW = self.MW # Molecular weights of each component (kg/mol) - Vmi = self.molar_liquid_vol(T) # Molar volume of each component (m^3/mol) - - # Calculate density (kg/m^3) - rho = Yi @ (MW / Vmi) - - return rho - - def mixture_kinematic_viscosity(self, Yi, T, correlation="Kendall-Monroe"): - """ - Calculate kinematic viscosity of the mixture. - - :meta private: Uses Kendall-Monroe (default) or Arrhenius mixing correlations. - - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :param correlation: Mixing model ("Kendall-Monroe" or "Arrhenius"). - :type correlation: str, optional - :return: Mixture kinematic viscosity in m^2/s. - :rtype: float - """ - nu_i = self.viscosity_kinematic(T) # Viscosities of individual components - - # Calculate mole fractions for each species - Xi = self.Y2X(Yi) - - if correlation.casefold() == "Arrhenius".casefold(): - # Arrhenius mixing correlation - nu = np.exp(np.sum(Xi * np.log(nu_i))) - else: - # Default: Kendall-Monroe mixing correlation - nu = np.sum(Xi * (nu_i ** (1.0 / 3.0))) ** (3.0) - - return nu - - def mixture_dynamic_viscosity(self, Yi, T, correlation="Kendall-Monroe"): - """ - Calculate dynamic viscosity of the mixture. - - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :param correlation: Mixing model ("Kendall-Monroe" or "Arrhenius"). - :type correlation: str, optional - :return: Mixture dynamic viscosity in Pa*s. - :rtype: float - """ - - nu = self.mixture_kinematic_viscosity(Yi, T, correlation=correlation) - rho = self.mixture_density(Yi, T) - - return rho * nu - - def mixture_vapor_pressure(self, Yi, T, correlation="Lee-Kesler"): - """ - Calculate vapor pressure of the mixture. - - :param Yi: Mass fractions of each compound in the mixture. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). - :type correlation: str, optional - :return: Mixture vapor pressure in Pa. - :rtype: float - """ - - # Mole fraction for each compound - Xi = self.Y2X(Yi) - - # Saturated vapor pressure for each compound (Pa) - p_sati = self.psat(T, correlation=correlation) - - # Mixture vapor pressure via Raoult's law - p_v = p_sati @ Xi - - return p_v - - def mixture_vapor_pressure_antoine_coeffs( - self, Yi, Tvals=None, units="mks", correlation="Lee-Kesler" - ): - """ - Estimate Antoine coefficients for vapor pressure of the mixture. - - :param Yi: Mass fractions of each compound in the mixture. - :type Yi: np.ndarray - :param Tvals: Temperature range or nodes for Antoine fit in Kelvin (default [273.15, min(Tb)]). - :type Tvals: np.ndarray, optional - :param units: Units for pressure in fit ("mks", "cgs", "bar", "atm") - :type units: str, optional - :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). - :type correlation: str, optional - :return: Coefficients A, B, C, D - :rtype: float - """ - - # Define or get temperature nodes for fit - if Tvals is None: - print("Tvals not specified, using [273.15, min(Tb_mix)] for mixture.") - # Initialize as zeros for now, calculated for each compound later - X = self.Y2X(Yi) - Tb = mixing_rule(self.Tb, X) - T = np.linspace(273.15, np.min(Tb), 20) - elif len(Tvals) == 2: - T = np.linspace(Tvals[0], Tvals[1], 20) - elif len(Tvals) > 2: - T = Tvals - else: - raise ValueError("Tvals must be None, length 2, or length > 2.") - - # Antoine equation log10(p) = A - B/(C + T) - def antoine_eq(T, A, B, C): - """ - Antoine equation for vapor pressure. - - :param T: Temperature. - :type T: float or np.ndarray - :param A: Antoine coefficient A. - :type A: float - :param B: Antoine coefficient B. - :type B: float - :param C: Antoine coefficient C. - :type C: float - :return: log10(pressure). - :rtype: float or np.ndarray - """ - return A - B / (T + C) - - # Determine conversion factor for pressure in MKS, CGS, bar, or atm - D = 1 # default is Pa - if units.lower() == "bar": - D = 1e5 - elif units.lower() == "atm": - D = 1.01325e5 - elif units.lower() == "cgs": - D = 1 / 10 # dyne/cm^2 - - Pvals = np.zeros_like(T) - for k in range(len(T)): - Pvals[k] = ( - self.mixture_vapor_pressure(Yi, T[k], correlation=correlation) / D - ) - - logP = np.log10(Pvals) - popt, _ = curve_fit(antoine_eq, T, logP, p0=[1, 1e3, -1]) # initial guess - A, B, C = popt - - return A, B, C, D - - def mixture_surface_tension(self, Yi, T, correlation="Brock-Bird"): - """ - Calculate surface tension of the mixture. - - :meta private: Uses arithmetic pseudo-property method recommended by Hugill and van Welsenes (1986). - - :param Yi: Mass fractions of each compound in the mixture. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :param correlation: Correlation method ("Pitzer" or "Brock-Bird"). - :type correlation: str, optional - :return: Mixture surface tension in N/m. - :rtype: float - """ - - # Mole fraction for each compound - Xi = self.Y2X(Yi) - - # Surface tension for each compound (N/m) - sti = self.surface_tension(T, correlation=correlation) - - # Mixture surface tension via arithmetic mean, Poling (12-5.2) - st = mixing_rule(sti, Xi, "arithmetic") - - return st - - def mixture_thermal_conductivity(self, Yi, T): - """ - Calculate thermal conductivity of the mixture. - - :param Yi: Mass fractions of each compound in the mixture. - :type Yi: np.ndarray - :param T: Temperature in Kelvin. - :type T: float - :return: Thermal conductivity in W/m/K. - :rtype: float - """ - tc = self.thermal_conductivity(T) - return np.sum(Yi * tc ** (-2)) ** (-0.5) - - -# ----------------------------------------------------------------------------- -# Utility functions -# ----------------------------------------------------------------------------- - - -def epsilon_to_characteristic_temperature(epsilon_j_per_mol): - """ - Convert Lennard-Jones epsilon from J/mol to characteristic temperature in Kelvin. - - The characteristic temperature (epsilon/k_B) is used in transport property - correlations and is required by combustion codes like CHEMKIN. - - Uses the relation: T* = (epsilon_J/mol) / (N_A * k_B) - - :param epsilon_j_per_mol: Lennard-Jones well depth epsilon in J/mol. - :type epsilon_j_per_mol: float - :return: Characteristic temperature (epsilon/k_B) in Kelvin. - :rtype: float - """ - epsilon_per_molecule = epsilon_j_per_mol / N_A - lj_welldepth_K = epsilon_per_molecule / k_B - return lj_welldepth_K - - -def C2K(T): - """ - Convert temperature from Celsius to Kelvin. - - :param T: Temperature in Celsius. - :type T: float or np.ndarray - :return: Temperature in Kelvin. - :rtype: float or np.ndarray - """ - return T + 273.15 - - -def K2C(T): - """ - Convert temperature from Kelvin to Celsius. - - :param T: Temperature in Kelvin. - :type T: float or np.ndarray - :return: Temperature in Celsius. - :rtype: float or np.ndarray - """ - return T - 273.15 - - -def C2F(T): - """ - Convert temperature from Celsius to Fahrenheit. - - :param T: Temperature in Celsius. - :type T: float or np.ndarray - :return: Temperature in Fahrenheit. - :rtype: float or np.ndarray - """ - return T * 9 / 5 + 32 - - -def F2C(T): - """ - Convert temperature from Fahrenheit to Celsius. - - :param T: Temperature in Fahrenheit. - :type T: float or np.ndarray - :return: Temperature in Celsius. - :rtype: float or np.ndarray - """ - return (T - 32) * 5 / 9 - - -def F2K(T): - """ - Convert temperature from Fahrenheit to Kelvin. - - :param T: Temperature in Fahrenheit. - :type T: float or np.ndarray - :return: Temperature in Kelvin. - :rtype: float or np.ndarray - """ - return C2K(F2C(T)) - - -def K2F(T): - """ - Convert temperature from Kelvin to Fahrenheit. - - :param T: Temperature in Kelvin. - :type T: float or np.ndarray - :return: Temperature in Fahrenheit. - :rtype: float or np.ndarray - """ - return C2F(K2C(T)) - - -def mixing_rule(var_n, X, pseudo_prop="arithmetic"): - """ - Mixing rules for computing mixture properties. - - :param var_n: Individual compound properties. - :type var_n: np.ndarray - :param X: Mole fractions of the compounds. - :type X: np.ndarray - :param pseudo_prop: Type of mean ("arithmetic" or "geometric"). - :type pseudo_prop: str, optional - :return: Mixture property value. - :rtype: float - """ - num_comps = len(var_n) - var_mix = 0.0 - for i in range(num_comps): - for j in range(num_comps): - if pseudo_prop.casefold() == "geometric": - # Use geometric mean definition for the pseudo property - var_ij = (var_n[i] * var_n[j]) ** (0.5) - else: - # Use arithmetic definition for the pseudo property - var_ij = (var_n[i] + var_n[j]) / 2 - var_mix += X[i] * X[j] * var_ij - return var_mix - - -def droplet_volume(r): - """ - Calculate spherical volume of a droplet given the radius. - - :param r: Radius of the droplet in meters. - :type r: float - :return: Spherical volume of droplet in cubic meters. - :rtype: float - """ - return 4.0 / 3.0 * np.pi * r**3 - - -def droplet_mass(fuel, r, Yi, T): - """ - Calculate the mass of each compound in the fuel provided the radius of the droplet. - - :param fuel: An instance of the fuel class. - :type fuel: fuel object - :param r: Radius of the droplet in meters. - :type r: float - :param Yi: Mass fractions of each compound. - :type Yi: np.ndarray - :param T: Droplet temperature in Kelvin. - :type T: float - :return: Mass of each compound in droplet in kg. - :rtype: np.ndarray - """ - volume = droplet_volume(r) # m^3 - if volume > 0: - return volume / (fuel.molar_liquid_vol(T) @ Yi) * Yi * fuel.MW - else: - return np.zeros_like(fuel.MW) diff --git a/fuellib/utilities/__init__.py b/fuellib/cli/__init__.py similarity index 100% rename from fuellib/utilities/__init__.py rename to fuellib/cli/__init__.py diff --git a/fuellib/utilities/fuel_manager.py b/fuellib/cli/_fuel_manager.py similarity index 100% rename from fuellib/utilities/fuel_manager.py rename to fuellib/cli/_fuel_manager.py diff --git a/fuellib/utilities/plotting.py b/fuellib/cli/plotting.py similarity index 100% rename from fuellib/utilities/plotting.py rename to fuellib/cli/plotting.py diff --git a/fuellib/utilities/temp_converter.py b/fuellib/cli/temp_converter.py similarity index 100% rename from fuellib/utilities/temp_converter.py rename to fuellib/cli/temp_converter.py diff --git a/fuellib/utilities/transport_props_converter.py b/fuellib/cli/transport_props_converter.py similarity index 100% rename from fuellib/utilities/transport_props_converter.py rename to fuellib/cli/transport_props_converter.py diff --git a/fuellib/constants.py b/fuellib/constants.py new file mode 100644 index 0000000..1dac3e8 --- /dev/null +++ b/fuellib/constants.py @@ -0,0 +1,7 @@ +"""Physical constants used in FuelLib calculations.""" + +# Physical constants +k_B = 1.380649e-23 # Boltzmann's constant in J/K +N_A = 6.02214076e23 # Avogadro's number in 1/mol + +__all__ = ["k_B", "N_A"] diff --git a/fuellib/conversions.py b/fuellib/conversions.py new file mode 100644 index 0000000..a29133b --- /dev/null +++ b/fuellib/conversions.py @@ -0,0 +1,106 @@ +"""Unit conversion functions.""" + +import numpy as np +from .constants import k_B, N_A + + +def C2K(T): + """ + Convert temperature from Celsius to Kelvin. + + :param T: Temperature in Celsius. + :type T: float or np.ndarray + :return: Temperature in Kelvin. + :rtype: float or np.ndarray + """ + return T + 273.15 + + +def K2C(T): + """ + Convert temperature from Kelvin to Celsius. + + :param T: Temperature in Kelvin. + :type T: float or np.ndarray + :return: Temperature in Celsius. + :rtype: float or np.ndarray + """ + return T - 273.15 + + +def C2F(T): + """ + Convert temperature from Celsius to Fahrenheit. + + :param T: Temperature in Celsius. + :type T: float or np.ndarray + :return: Temperature in Fahrenheit. + :rtype: float or np.ndarray + """ + return T * 9 / 5 + 32 + + +def F2C(T): + """ + Convert temperature from Fahrenheit to Celsius. + + :param T: Temperature in Fahrenheit. + :type T: float or np.ndarray + :return: Temperature in Celsius. + :rtype: float or np.ndarray + """ + return (T - 32) * 5 / 9 + + +def F2K(T): + """ + Convert temperature from Fahrenheit to Kelvin. + + :param T: Temperature in Fahrenheit. + :type T: float or np.ndarray + :return: Temperature in Kelvin. + :rtype: float or np.ndarray + """ + return C2K(F2C(T)) + + +def K2F(T): + """ + Convert temperature from Kelvin to Fahrenheit. + + :param T: Temperature in Kelvin. + :type T: float or np.ndarray + :return: Temperature in Fahrenheit. + :rtype: float or np.ndarray + """ + return C2F(K2C(T)) + + +def epsilon_to_characteristic_temperature(epsilon_j_per_mol): + """ + Convert Lennard-Jones epsilon from J/mol to characteristic temperature in Kelvin. + + The characteristic temperature (epsilon/k_B) is used in transport property + correlations and is required by combustion codes like CHEMKIN. + + Uses the relation: T* = (epsilon_J/mol) / (N_A * k_B) + + :param epsilon_j_per_mol: Lennard-Jones well depth epsilon in J/mol. + :type epsilon_j_per_mol: float + :return: Characteristic temperature (epsilon/k_B) in Kelvin. + :rtype: float + """ + epsilon_per_molecule = epsilon_j_per_mol / N_A + lj_welldepth_K = epsilon_per_molecule / k_B + return lj_welldepth_K + + +__all__ = [ + "C2K", + "K2C", + "C2F", + "F2C", + "F2K", + "K2F", + "epsilon_to_characteristic_temperature", +] diff --git a/fuellib/fuel.py b/fuellib/fuel.py new file mode 100644 index 0000000..45d33e7 --- /dev/null +++ b/fuellib/fuel.py @@ -0,0 +1,1128 @@ +"""Fuel class for Group Contribution Method calculations.""" + +import os +import numpy as np +import pandas as pd +from scipy.optimize import curve_fit + +from .constants import k_B, N_A +from .conversions import K2C +from .utilities import mixing_rule +from ._data_locator import ( + get_gcmtable_dir, + get_fueldata_dir, + get_fueldata_gc_dir, + get_fueldata_decomp_dir, + get_fueldata_props_dir, + get_decomp_name_from_metadata, +) + + +class fuel: + """ + Class for handling group contribution calculations of thermodynamic and mixture properties. + + :param name: Name of the mixture as it appears in its gcData file. + :type name: str + :param decompName: Name of the groupDecomposition file if different from name. Defaults to None. + :type decompName: str, optional + :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. + :type fuelDataDir: str, optional + + **Data Directory Attributes:** + + :ivar fuelDataDir: Root directory for fuel data (custom or embedded). + :ivar fuelDataGcDir: Directory containing GCxGC compositional data files. + :ivar fuelDataDecompDir: Directory containing functional group decomposition files. + :ivar fuelDataPropsDir: Directory containing experimental property data (may be None). + + **Composition Attributes:** + + :ivar name: Name of the fuel/mixture. + :ivar compounds: List of compound names in the mixture. + :ivar formulas: Molecular formulas for each compound (if available). + :ivar Y_0: Mass fractions of each compound (array, shape: num_compounds). + :ivar Nij: Functional group decomposition matrix (array, shape: num_compounds × num_groups). + :ivar num_compounds: Number of compounds in the mixture. + :ivar num_groups: Number of functional groups in the decomposition. + + **Pure Component Properties (Critical, Molecular):** + + :ivar MW: Molecular weights in kg/mol (array, shape: num_compounds). + :ivar Tc: Critical temperatures in K (array, shape: num_compounds). + :ivar Pc: Critical pressures in Pa (array, shape: num_compounds). + :ivar Vc: Critical volumes in m³/mol (array, shape: num_compounds). + :ivar Tb: Boiling temperatures in K (array, shape: num_compounds). + :ivar Tm: Melting temperatures in K (array, shape: num_compounds). + + **Thermodynamic Properties (at 298.15 K):** + + :ivar Hf: Enthalpy of formation in J/mol (array, shape: num_compounds). + :ivar Gf: Gibbs free energy in J/mol (array, shape: num_compounds). + :ivar Hv_stp: Enthalpy of vaporization at 298 K in J/mol (array, shape: num_compounds). + :ivar Lv_stp: Latent heat of vaporization at 298 K in J/kg (array, shape: num_compounds). + :ivar Cp_stp: Molar specific heat at 298 K in J/mol/K (array, shape: num_compounds). + :ivar Vm_stp: Molar liquid volume at 298 K in m³/mol (array, shape: num_compounds). + :ivar omega: Acentric factors (array, shape: num_compounds). + + **Lennard-Jones Transport Parameters:** + + :ivar sigma: Lennard-Jones collision diameters in m (array, shape: num_compounds). + :ivar epsilonByKB: Lennard-Jones well depths in K (array, shape: num_compounds). + + **Classification Attributes:** + + :ivar hc_type: Hydrocarbon types ("n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene"). + :ivar fam: Family codes for thermal conductivity (0: saturated, 1: aromatic, 2: cycloparaffin, 3: olefin). + :ivar nC: Carbon numbers (array, shape: num_compounds). + :ivar nH: Hydrogen numbers (array, shape: num_compounds). + + **Optional Attributes:** + + :ivar pelephysics_keys: PelePhysics keys for each compound (if available). + """ + + # Number of first and second order groups from Constantinou and Gani + N_g1 = 78 + N_g2 = 43 + + def __init__(self, name, decompName=None, fuelDataDir=None): + """ + Initialize the fuel object and calculate GCM properties. + + :param name: Name of the mixture as it appears in its gcData file. + :type name: str + :param decompName: Name of the groupDecomposition file if different from name. + :type decompName: str, optional + :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. + :type fuelDataDir: str, optional + """ + + self.name = name + if decompName is None: + # Try to get decomposition name from metadata + decompName = get_decomp_name_from_metadata(name, fuelDataDir) + + # Determine and set data directories for this fuel instance + if fuelDataDir is None: + # Use built-in embedded data + self.fuelDataDir = get_fueldata_dir() + self.fuelDataGcDir = get_fueldata_gc_dir() + self.fuelDataDecompDir = get_fueldata_decomp_dir() + self.fuelDataPropsDir = get_fueldata_props_dir() + else: + # Validate and use custom fuel directory + from ._data_locator import ( + _validate_fuel_data_dir, + _get_props_dir_for_fueldata, + ) + + _validate_fuel_data_dir(fuelDataDir) + self.fuelDataDir = fuelDataDir + self.fuelDataGcDir = os.path.join(fuelDataDir, "gcData") + self.fuelDataDecompDir = os.path.join(fuelDataDir, "groupDecompositionData") + self.fuelDataPropsDir = _get_props_dir_for_fueldata(fuelDataDir) + + # Get GCM table directory (always from built-in data) + gcmtable_dir = get_gcmtable_dir() + + self.groupDecompFile = os.path.join(self.fuelDataDecompDir, f"{decompName}.csv") + self.gcxgcFile = os.path.join(self.fuelDataGcDir, f"{name}_init.csv") + self.gcmTableFile = os.path.join(gcmtable_dir, "gcmTable.csv") + + # Read functional group data for mixture (num_compounds,num_groups) + df_Nij = pd.read_csv(self.groupDecompFile) + self.Nij = df_Nij.iloc[:, 1:].to_numpy() + self.num_compounds = self.Nij.shape[0] + self.num_groups = self.Nij.shape[1] + + # Classify hydrocarbon by family (used in thermal conductivity) + # 0: saturated hydrocarbons + # 1: aromatics + # 2: cycloparaffins + # 3: olefins + self.fam = np.zeros(self.num_compounds, dtype=int) + + # Classify hydrocarbon by type (n-alkane, iso-alkane, cyclo-alkane, aromatic) + # Based on group decompositions from Constantinou-Gani method + self.hc_type = np.array([""] * self.num_compounds, dtype=object) + + aromatics = 10 # starting index for aromatic groups + num_aromatics = 5 + branching = 78 # starting index for branching groups (Group j (CH3)2CH through C(CH3)2C(CH3)2) + num_branching = 5 # groups 78-82 inclusive + cyclos = 83 # starting index for membered ring groups (3-7 membered rings) + num_cyclos = 5 + olefins = 4 # starting index for double bound groups + num_olefins = 6 + + for i in range(self.num_compounds): + # Check if aromatic: does it contain AC's? + if sum(self.Nij[i, aromatics : aromatics + num_aromatics]) > 0: + self.fam[i] = 1 + self.hc_type[i] = "aromatic" + # Check if cycloparaffin: does it contain rings? + elif sum(self.Nij[i, cyclos : cyclos + num_cyclos]) > 0: + self.fam[i] = 2 + self.hc_type[i] = "cyclo-alkane" + # Check if olefin: does it contain double bonds? + elif sum(self.Nij[i, olefins : olefins + num_olefins]) > 0: + self.fam[i] = 3 + self.hc_type[i] = "alkene" + # Check for branching groups (CH, C quaternary carbons) + elif sum(self.Nij[i, branching : branching + num_branching]) > 0: + self.hc_type[i] = "iso-alkane" + else: + # Only CH3 and CH2 -> n-alkane (linear) + self.hc_type[i] = "n-alkane" + + # Calculate carbon and hydrogen numbers from first-order group decomposition + # For jet fuels, use only alkyl (0-3) and aromatic (10-14) groups + # Alkyl: CH3=1C,3H; CH2=1C,2H; CH=1C,1H; C=1C,0H + # Aromatic: ACH=1C,1H; AC=1C,0H; ACCH3=2C,3H; ACCH2=2C,2H; ACCH=2C,1H + alkyl_carbons = np.array([1, 1, 1, 1]) # groups 0-3 + alkyl_hydrogens = np.array([3, 2, 1, 0]) + # Olefinic: group 4 appears to represent 2 carbons with 3 hydrogens in UNIFAC-based system + olefinic_carbons = np.array([2, 1, 1, 0, 0, 0]) # groups 4-9 + olefinic_hydrogens = np.array([3, 1, 0, 0, 0, 0]) + aromatic_carbons = np.array([1, 1, 2, 2, 2]) # groups 10-14 + aromatic_hydrogens = np.array([1, 0, 3, 2, 1]) + + self.nC = np.zeros(self.num_compounds, dtype=float) + self.nH = np.zeros(self.num_compounds, dtype=float) + for i in range(self.num_compounds): + # Alkyl contribution (groups 0-3) + self.nC[i] = np.dot(self.Nij[i, 0:4], alkyl_carbons) + self.nH[i] = np.dot(self.Nij[i, 0:4], alkyl_hydrogens) + # Olefinic contribution (groups 4-9) + self.nC[i] += np.dot(self.Nij[i, 4:10], olefinic_carbons) + self.nH[i] += np.dot(self.Nij[i, 4:10], olefinic_hydrogens) + # Aromatic contribution (groups 10-14) + self.nC[i] += np.dot(self.Nij[i, 10:15], aromatic_carbons) + self.nH[i] += np.dot(self.Nij[i, 10:15], aromatic_hydrogens) + + # Read GCxGC/compound data + df_gcxgc = pd.read_csv(self.gcxgcFile) + + self.compounds = [ + compound.strip() for compound in df_gcxgc["Compound"].to_list() + ] + + # Load molecular formulas if available + if "Formula" in df_gcxgc.columns: + self.formulas = [ + formula.strip() if pd.notna(formula) else None + for formula in df_gcxgc["Formula"].to_list() + ] + else: + self.formulas = None + + if "PelePhysics Key" in df_gcxgc.columns: + self.pelephysics_keys = [ + key.strip() for key in df_gcxgc["PelePhysics Key"].to_list() + ] + else: + self.pelephysics_keys = None + + self.Y_0 = df_gcxgc["Weight %"].to_numpy().flatten().astype(float) + self.Y_0 /= np.sum(self.Y_0) + + # Make sure mixture data is consistent: + if self.num_groups < self.N_g1: + raise ValueError( + f"Insufficient mixture description:\n" + f"The number of columns in {self.groupDecompFile} is less than " + f"the required number of first-order groups (N_g1 = {self.N_g1})." + ) + if self.Y_0.shape[0] != self.num_compounds: + raise ValueError( + f"Insufficient mixture description:\n" + f"The number of compounds in {self.groupDecompFile} does not " + f"equal the number of compounds in {self.gcxgcFile}." + ) + + # Read and store GCM table properties + df_table = pd.read_csv(self.gcmTableFile) + df_table = df_table.drop(columns=["Units"]) + + def get_row(property_name): + """ + Get property row from GCM table. + + :param property_name: Name of the property to retrieve. + :type property_name: str + :return: Property values for all functional groups. + :rtype: np.ndarray + :raises ValueError: If property not found in GCM table. + """ + row = df_table[df_table["Property"] == property_name] + if row.empty: + raise ValueError(f"Property '{property_name}' not found in GCM table.") + return row.iloc[:, 1:].to_numpy().flatten() + + # Table data for functional groups (num_compounds,) + Tck = get_row("tck") # critical temperature (1) + Pck = get_row("pck") # critical pressure (bar) + Vck = get_row("vck") # critical volume (m^3/kmol) + Tbk = get_row("tbk") # boiling temperature (1) + Tmk = get_row("tmk") # melting point temperature (1) + hfk = get_row("hfk") # enthalpy of formation, (kJ/mol) + gfk = get_row("gfk") # Gibbs energy (kJ/mol) + hvk = get_row("hvk") # latent heat of vaporization (kJ/mol) + wk = get_row("wk") # accentric factor (1) + Vmk = get_row("vmk") # liquid molar volume fraction (m^3/kmol) + cpak = get_row("CpAk") # specific heat values (J/mol/K) + cpbk = get_row("CpBk") # specific heat values (J/mol/K) + cpck = get_row("CpCk") # specific heat values (J/mol/K) + mwk = get_row("MW") # molecular weights (g/mol) + + # --- Compute critical properties at standard temp (num_compounds,) + # Molecular weights + self.MW = np.matmul(self.Nij, mwk) # g/mol + self.MW *= 1e-3 # Convert to kg/mol + + # T_c (critical temperature) + self.Tc = 181.128 * np.log(np.matmul(self.Nij, Tck)) # K + + # p_c (critical pressure) + self.Pc = 1.3705 + (np.matmul(self.Nij, Pck) + 0.10022) ** (-2) # bar + self.Pc *= 1e5 # Convert to Pa from bar + + # V_c (critical volume) + self.Vc = -0.00435 + (np.matmul(self.Nij, Vck)) # m^3/kmol + self.Vc *= 1e-3 # Convert to m^3/mol + + # T_b (boiling temperature) + self.Tb = 204.359 * np.log(np.matmul(self.Nij, Tbk)) # K + + # T_m (melting temperature) + self.Tm = 102.425 * np.log(np.matmul(self.Nij, Tmk)) # K + + # H_f (enthalpy of formation) + self.Hf = 10.835 + np.matmul(self.Nij, hfk) # kJ/mol + self.Hf *= 1e3 # Convert to J/mol + + # G_f (Gibbs free energy) + self.Gf = -14.828 + np.matmul(self.Nij, gfk) # kJ/mol + self.Gf *= 1e3 # Convert to J/mol + + # H_v,stp (enthalpy of vaporization at 298 K) + self.Hv_stp = 6.829 + (np.matmul(self.Nij, hvk)) # kJ/mol + self.Hv_stp *= 1e3 # Convert to J/mol + + # omega (accentric factor) + self.omega = 0.4085 * np.log(np.matmul(self.Nij, wk) + 1.1507) ** (1.0 / 0.5050) + + # V_m (molar liquid volume at 298 K) + self.Vm_stp = 0.01211 + np.matmul(self.Nij, Vmk) # m^3/kmol + self.Vm_stp *= 1e-3 # Convert to m^3/mol + + # C_p,stp (molar specific heat at 298 K) + self.Cp_stp = np.matmul(self.Nij, cpak) - 19.7779 # J/mol/K + + # Temperature corrections for C_p + self.Cp_B = np.matmul(self.Nij, cpbk) + self.Cp_C = np.matmul(self.Nij, cpck) + + # L_v,stp (latent heat of vaporization at 298 K) + self.Lv_stp = self.Hv_stp / self.MW # J/kg + + # Lennard-Jones parameters for diffusion calculations (Tee et al. 1966) + self.epsilonByKB = (0.7915 + 0.1693 * self.omega) * self.Tc # K + Pc_atm = self.Pc / 101325 # atm + self.sigma = (2.3551 - 0.0874 * self.omega) * (self.Tc / Pc_atm) ** ( + 1.0 / 3 + ) # Angstroms + self.sigma *= 1e-10 # Convert from Angstroms to m + + # ------------------------------------------------------------------------- + # Member functions + # ------------------------------------------------------------------------- + def mean_molecular_weight(self, Yi): + """ + Calculate the mean molecular weight of the mixture. + + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :return: Mean molecular weight of the mixture in kg/mol. + :rtype: float + """ + if np.sum(Yi) != 0: + Mbar = 1 / np.sum(Yi / self.MW) # mean molar weight of the mixture + else: + Mbar = 0.0 + + return Mbar + + def mass2Y(self, mass): + """ + Calculate the mass fractions from the mass of each component. + + :param mass: Mass of each compound. + :type mass: np.ndarray + :return: Mass fractions of the compounds (shape: num_compounds,). + :rtype: np.ndarray + """ + # Normalize to get group mole fractions + total_mass = np.sum(mass) + if total_mass != 0: + Yi = mass / total_mass + else: + Yi = np.zeros_like(self.MW) + + return Yi + + def mass2X(self, mass): + """ + Calculate the mole fractions from the mass of each component. + + :param mass: Mass of each compound. + :type mass: np.ndarray + :return: Mass fractions of the compounds (shape: num_compounds,). + :rtype: np.ndarray + """ + # Calculate the number of moles for each compound + num_mole = mass / self.MW + + # Normalize to get group mole fractions + total_moles = np.sum(num_mole) + if total_moles != 0: + Xi = num_mole / total_moles + else: + Xi = np.zeros_like(self.MW) + + return Xi + + def X2Y(self, Xi): + """ + Calculate the mass fractions from the mole fractions of each component. + + :param Xi: Mole fractions of each compound. + :type Xi: np.ndarray + :return: Mass fractions of the compounds (shape: num_compounds,). + :rtype: np.ndarray + """ + # Calculate the mass for each compound + mass = Xi * self.MW + + # Normalize to get group mass fractions + total_mass = np.sum(mass) + if total_mass != 0: + Yi = mass / total_mass + else: + Yi = np.zeros_like(self.MW) + + return Yi + + def Y2X(self, Yi): + """ + Calculate the mole fractions from the mass fractions of each component. + + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :return: Mole fractions of the compounds (shape: num_compounds,). + :rtype: np.ndarray + """ + Mbar = self.mean_molecular_weight(Yi) + if np.sum(Yi) != 0: + Xi = Mbar * Yi / self.MW + else: + Xi = np.zeros_like(self.MW) + + return Xi + + def density(self, T, comp_idx=None): + """ + Calculate the density of each component at temperature T. + + :param T: Temperature of the mixture in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Density of each compound in kg/m^3. + :rtype: np.ndarray + """ + if comp_idx is None: + MW = self.MW # kg/mol + Vm = self.molar_liquid_vol(T) # m^3/mol + else: + MW = self.MW[comp_idx] # kg/mol + Vm = self.molar_liquid_vol(T, comp_idx=comp_idx) # m^3/mol + + rho = MW / Vm # kg/m^3 + return rho + + def viscosity_kinematic(self, T, comp_idx=None): + """ + Calculate the viscosity using Dutt's equation. + + :meta private: This uses Dutt's equation (4.23) from "Viscosity of Liquids". + :meta private: The equation predicts viscosity in mm^2/s and is converted to SI units. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Viscosity of each component in m^2/s. + :rtype: np.ndarray + """ + + # Convert temperature to Celsius + T_cels = K2C(T) + if comp_idx is None: + Tb_cels = K2C(self.Tb) + else: + Tb_cels = K2C(self.Tb[comp_idx]) + + # RHS of Dutt's equation (4.23) in Viscosity of Liquids + rhs = -3.0171 + (442.78 + 1.6452 * Tb_cels) / (T_cels + 239 - 0.19 * Tb_cels) + nu_i = np.exp(rhs) # Viscosity in mm^2/s + + # Convert to SI (m^2/s) + nu_i = nu_i * 1e-6 + + return nu_i + + def viscosity_dynamic(self, T, comp_idx=None): + """ + Calculate liquid dynamic viscosity based on droplet temperature and density. + + :meta private: Uses Dutt's equation (4.23) for kinematic viscosity, combined with density. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Dynamic viscosity in Pa*s. + :rtype: np.ndarray + """ + + nu_i = self.viscosity_kinematic(T, comp_idx=comp_idx) # m^2/s + rho_i = self.density(T, comp_idx=comp_idx) # kg/m^3 + mu_i = nu_i * rho_i # Pa*s + return mu_i + + def Cp(self, T, comp_idx=None): + """ + Compute molar specific heat capacity at a given temperature. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Molar specific heat capacity in J/mol/K. + :rtype: np.ndarray + """ + + theta = (T - 298) / 700 + if comp_idx is None: + Cp_stp = self.Cp_stp + Cp_B = self.Cp_B + Cp_C = self.Cp_C + else: + Cp_stp = self.Cp_stp[comp_idx] + Cp_B = self.Cp_B[comp_idx] + Cp_C = self.Cp_C[comp_idx] + + cp = Cp_stp + Cp_B * theta + Cp_C * theta**2 + + return cp + + def Cl(self, T, comp_idx=None): + """ + Compute liquid mass specific heat capacity in J/kg/K at a given temperature. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Mass specific heat capacity in J/kg/K. + :rtype: np.ndarray + """ + if comp_idx is None: + MW = self.MW + else: + MW = self.MW[comp_idx] + cp = self.Cp(T, comp_idx=comp_idx) + return cp / MW + + def psat(self, T, comp_idx=None, correlation="Lee-Kesler"): + """ + Compute saturated vapor pressure. + + :meta private: Can use Ambrose-Walton or Lee-Kesler correlations (default Lee-Kesler). + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). + :type correlation: str, optional + :return: Saturated vapor pressure in Pa. + :rtype: np.ndarray + """ + + if comp_idx is None: + Tr = T / self.Tc + Pc = self.Pc + omega = self.omega + else: + Tr = T / self.Tc[comp_idx] + Pc = self.Pc[comp_idx] + omega = self.omega[comp_idx] + + if correlation.casefold() == "Ambrose-Walton".casefold(): + # May cause trouble at high temperatures + tau = 1 - Tr + f0 = ( + -5.97616 * tau + + 1.29874 * tau**1.5 + - 0.60394 * tau**2.5 + - 1.06841 * tau**5.0 + ) + f0 /= Tr + f1 = ( + -5.03365 * tau + + 1.11505 * tau**1.5 + - 5.41217 * tau**2.5 + - 7.46628 * tau**5.0 + ) + f1 /= Tr + f2 = ( + -0.64771 * tau + + 2.41539 * tau**1.5 + - 4.26979 * tau**2.5 + - 3.25259 * tau**5.0 + ) + f2 /= Tr + rhs = np.exp(f0 + omega * f1 + omega**2 * f2) + + else: # Default correlation is Lee-Kesler + f0 = 5.92714 - (6.09648 / Tr) - 1.28862 * np.log(Tr) + 0.169347 * (Tr**6) + f1 = 15.2518 - (15.6875 / Tr) - 13.4721 * np.log(Tr) + 0.43577 * (Tr**6) + rhs = np.exp(f0 + omega * f1) + + psat = Pc * rhs + return psat + + def psat_antoine_coeffs(self, Tvals=None, units="mks", correlation="Lee-Kesler"): + """ + Estimate Antoine coefficients for vapor pressure of an individual compound. + + :param Tvals: Temperature range or nodes for Antoine fit in Kelvin (default [273.15, Tb_i]). + :type Tvals: np.ndarray, optional + :param units: Units for pressure in fit ("mks", "cgs", "bar", "atm") + :type units: str, optional + :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). + :type correlation: str, optional + :return: Coefficients A, B, C, D + :rtype: 4 np.ndarrays + """ + + # Define or get temperature nodes for fit + if Tvals is None: + print("Tvals not specified, using [273.15, Tb_i] for each compound.") + # Initialize as zeros for now, calculated for each compound later + T = np.zeros(20) + elif len(Tvals) == 2: + T = np.linspace(Tvals[0], Tvals[1], 20) + elif len(Tvals) > 2: + T = Tvals + else: + raise ValueError("Tvals must be None, length 2, or length > 2.") + + # Antoine equation log10(p) = A - B/(C + T) + def antoine_eq(T, A, B, C): + """Antoine equation for vapor pressure.""" + return A - B / (T + C) + + # Determine conversion factor for pressure in MKS, CGS, bar, or atm + D = 1 # default is Pa + if units.lower() == "bar": + D = 1e5 + elif units.lower() == "atm": + D = 1.01325e5 + elif units.lower() == "cgs": + D = 1 / 10 # dyne/cm^2 + + # Fit Antoine coefficients for each compound + A = np.zeros(self.num_compounds) + B = np.zeros(self.num_compounds) + C = np.zeros(self.num_compounds) + for i in range(self.num_compounds): + # Update T if not specified + if Tvals is None: + T = np.linspace(273.15, self.Tb[i], 20) + Pvals = np.zeros_like(T) + for k in range(len(T)): + Pvals[k] = 1 / D * self.psat(T[k], correlation=correlation)[i] + + logP = np.log10(Pvals) + popt, _ = curve_fit(antoine_eq, T, logP, p0=[1, 1e3, -1]) + A[i], B[i], C[i] = popt + D = D + np.zeros(self.num_compounds) # make D an array + return A, B, C, D + + def molar_liquid_vol(self, T, comp_idx=None): + """ + Compute molar liquid volume with temperature correction. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Molar liquid volume in m^3/mol. + :rtype: np.ndarray + """ + + Tstp = 298.0 + if comp_idx is None: + Tc = self.Tc + omega = self.omega + Vm_stp = self.Vm_stp + else: + Tc = np.array([self.Tc[comp_idx]]) + omega = np.array([self.omega[comp_idx]]) + Vm_stp = np.array([self.Vm_stp[comp_idx]]) + phi = np.zeros_like(Tc) + for i in range(len(Tc)): + if T > Tc[i]: + phi[i] = -((1 - (Tstp / Tc[i])) ** (2.0 / 7.0)) + else: + phi[i] = ((1 - (T / Tc[i])) ** (2.0 / 7.0)) - ( + (1 - (Tstp / Tc[i])) ** (2.0 / 7.0) + ) + z = 0.29056 - 0.08775 * omega + Vmi = Vm_stp * np.power(z, phi) + if comp_idx is not None: + Vmi = Vmi[0] + return Vmi + + def latent_heat_vaporization(self, T, comp_idx=None): + """ + Calculate latent heat of vaporization adjusted for temperature. + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Latent heat of vaporization in J/kg. + :rtype: np.ndarray + """ + if comp_idx is None: + Tc = self.Tc + Tb = self.Tb + Lv_stp = self.Lv_stp + else: + Tc = np.array([self.Tc[comp_idx]]) + Tb = np.array([self.Tb[comp_idx]]) + Lv_stp = np.array([self.Lv_stp[comp_idx]]) + + # Reduced temperatures + Tr = T / Tc + Trb = Tb / Tc + + Lvi = np.zeros_like(Tc) + for i in range(len(Tc)): + if T > Tc[i]: + Lvi[i] = 0.0 + else: + Lvi[i] = Lv_stp[i] * (((1.0 - Tr[i]) / (1.0 - Trb[i])) ** 0.38) + + if comp_idx is not None: + Lvi = Lvi[0] + return Lvi + + def diffusion_coeff( + self, + p, + T, + sigma_gas=3.62e-10, + epsilonByKB_gas=97.0, + MW_gas=28.97e-3, + correlation="Tee", + ): + """ + Compute diffusion coefficients using Lennard-Jones parameters. + + :meta private: Uses Wilke and Lee method (Poling, equation 11-4.1). + :meta private: Ambient gas defaults to air parameters. + + :param p: Pressure in Pa. + :type p: float + :param T: Temperature in Kelvin. + :type T: float + :param sigma_gas: Collision diameter in m. + :type sigma_gas: float, optional + :param epsilonByKB_gas: Well depth over Boltzmann constant, in K. + :type epsilonByKB_gas: float, optional + :param MW_gas: Mean molecular weight of ambient gas in kg/mol. + :type MW_gas: float, optional + :param correlation: Method to calculate sigma and epsilon ("Tee" or "Wilke"). + :type correlation: str, optional + :return: Diffusion coefficient. + :rtype: np.ndarray + """ + + # Method of Tee for calculating liquid sigma and epsilon + if correlation.casefold() == "Tee".casefold(): + sigma_i = self.sigma * 1e10 # convert from m to Angstroms + epsilonByKB_i = self.epsilonByKB # K + else: + # Method of Wilke & Lee calculating liquid sigma and epsilon + Vmb_i = np.zeros_like(self.Tb) + for n in range(self.num_compounds): + Vmb_i[n] = self.molar_liquid_vol(self.Tb[n])[n] * 1e6 # cm^3/mol + sigma_i = 1.18 * Vmb_i ** (1 / 3) # Angstroms, Poling (11-4.2) + epsilonByKB_i = 1.15 * self.Tb # K , Poling (11-4.3) + + # Compute binary sigma and epsilon + sigma_gas = sigma_gas * 1e10 # convert from m to Angstroms + sigmaAB_i = (sigma_gas + sigma_i) / 2 # Angstroms, Poling (11-3.5) + epsilonAB_byKB_i = ( + epsilonByKB_gas * epsilonByKB_i + ) ** 0.5 # K, Poling (11-3.4) + + # Dimensionless collision integral for diffusion: Poling (11-3.6) + Tstar_i = T / epsilonAB_byKB_i # [1] + A = 1.06036 + B = 0.15610 + C = 0.193 + D = 0.47635 + E = 1.03587 + F = 1.52996 + G = 1.76474 + H = 3.89411 + omegaD_i = ( + A / (Tstar_i**B) + + C / np.exp(D * Tstar_i) + + E / np.exp(F * Tstar_i) + + G / np.exp(H * Tstar_i) + ) + + # Convert molecular weights from kg/mol to g/mol then calculate M_AB + MW_gas = MW_gas * 1e3 + MW_i = self.MW * 1e3 + M_AB_i = 2 * (MW_i * MW_gas) / (MW_i + MW_gas) # g/mol, see Poling (11-3.1) + + # Convert pressure from Pa to bar + p = p * 1e-5 # bar + + # Binary diffusion coefficients, Poling (11-4.1) + D_AB_i = ( + 1e-3 + * (3.03 - 0.98 / (M_AB_i**0.5)) + * (T**1.5) + / (p * M_AB_i**0.5 * sigmaAB_i**2 * omegaD_i) + ) # cm^2/s + D_AB_i = D_AB_i * 1e-4 # Convert to m^2/s + + return D_AB_i + + def surface_tension(self, T, comp_idx=None, correlation="Brock-Bird"): + """ + Calculate surface tension of each compound at a given temperature. + + :meta private: Uses Brock-Bird (default) or Pitzer correlations (Poling 12-3.5, 12-3.7). + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :param correlation: Correlation method ("Brock-Bird" or "Pitzer"). + :type correlation: str, optional + :return: Surface tension in N/m. + :rtype: np.ndarray + """ + if comp_idx is None: + Tc = self.Tc + Pc = self.Pc + Tb = self.Tb + omega = self.omega + else: + Tc = np.array([self.Tc[comp_idx]]) + Pc = np.array([self.Pc[comp_idx]]) + Tb = np.array([self.Tb[comp_idx]]) + omega = np.array([self.omega[comp_idx]]) + Tr = T / Tc + Pc = Pc * 1e-5 # convert from Pa to bar + + if correlation.casefold() == "Brock-Bird".casefold(): + Tbr = Tb / Tc + Q = 0.1196 * (1.0 + (Tbr * np.log(Pc / 1.01325)) / (1.0 - Tbr)) - 0.279 + else: + w = omega + Q = ( + (1.86 + 1.18 * w) + / 19.05 + * (((3.75 + 0.91 * w) / (0.291 - 0.08 * w)) ** (2.0 / 3.0)) + ) + + st = Pc ** (2.0 / 3.0) * Tc ** (1.0 / 3.0) * Q * (1 - Tr) ** (11.0 / 9.0) + + st = st * 1e-3 # Convert from dyn/cm to N/m + if comp_idx is not None: + st = st[0] + + return st + + def thermal_conductivity(self, T, comp_idx=None): + """ + Calculate thermal conductivity at a given temperature. + + :meta private: Uses Latini et al. method (Poling equation 10-9.1). + + :param T: Temperature in Kelvin. + :type T: float + :param comp_idx: Index of compound to calculate property for. + :type comp_idx: int, optional + :return: Thermal conductivity in W/m/K. + :rtype: np.ndarray + """ + if comp_idx is None: + MW = self.MW + Tc = self.Tc + Tb = self.Tb + fam = self.fam + else: + MW = np.array([self.MW[comp_idx]]) + Tc = np.array([self.Tc[comp_idx]]) + Tb = np.array([self.Tb[comp_idx]]) + fam = np.array([self.fam[comp_idx]]) + + Astar = 0.00350 + np.zeros_like(Tc) + alpha = 1.2 + beta = 0.5 + np.zeros_like(Tc) + gamma = 0.167 + MW_beta = MW * 1e3 # convert from kg/mol to g/mol + Tr = T / Tc + + for i in range(len(Tc)): + if fam[i] == 1: + # Aromatics + Astar[i] = 0.0346 + beta[i] = 1.0 + elif fam[i] == 2: + # Cycloparaffins + Astar[i] = 0.0310 + beta[i] = 1.0 + elif fam[i] == 3: + # Olefins + Astar[i] = 0.0361 + beta[i] = 1.0 + MW_beta[i] = MW_beta[i] ** beta[i] + + A = Astar * Tb**alpha / (MW_beta * Tc**gamma) + tc = A * (1 - Tr) ** (0.38) / (Tr ** (1 / 6)) + + if comp_idx is not None: + tc = tc[0] + return tc + + # --- Mixture functions --- + def mixture_density(self, Yi, T): + """ + Calculate mixture density at a given temperature. + + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :return: Mixture density in kg/m^3. + :rtype: float + """ + MW = self.MW # Molecular weights of each component (kg/mol) + Vmi = self.molar_liquid_vol(T) # Molar volume of each component (m^3/mol) + + # Calculate density (kg/m^3) + rho = Yi @ (MW / Vmi) + + return rho + + def mixture_kinematic_viscosity(self, Yi, T, correlation="Kendall-Monroe"): + """ + Calculate kinematic viscosity of the mixture. + + :meta private: Uses Kendall-Monroe (default) or Arrhenius mixing correlations. + + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :param correlation: Mixing model ("Kendall-Monroe" or "Arrhenius"). + :type correlation: str, optional + :return: Mixture kinematic viscosity in m^2/s. + :rtype: float + """ + nu_i = self.viscosity_kinematic(T) # Viscosities of individual components + + # Calculate mole fractions for each species + Xi = self.Y2X(Yi) + + if correlation.casefold() == "Arrhenius".casefold(): + # Arrhenius mixing correlation + nu = np.exp(np.sum(Xi * np.log(nu_i))) + else: + # Default: Kendall-Monroe mixing correlation + nu = np.sum(Xi * (nu_i ** (1.0 / 3.0))) ** (3.0) + + return nu + + def mixture_dynamic_viscosity(self, Yi, T, correlation="Kendall-Monroe"): + """ + Calculate dynamic viscosity of the mixture. + + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :param correlation: Mixing model ("Kendall-Monroe" or "Arrhenius"). + :type correlation: str, optional + :return: Mixture dynamic viscosity in Pa*s. + :rtype: float + """ + + nu = self.mixture_kinematic_viscosity(Yi, T, correlation=correlation) + rho = self.mixture_density(Yi, T) + + return rho * nu + + def mixture_vapor_pressure(self, Yi, T, correlation="Lee-Kesler"): + """ + Calculate vapor pressure of the mixture. + + :param Yi: Mass fractions of each compound in the mixture. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). + :type correlation: str, optional + :return: Mixture vapor pressure in Pa. + :rtype: float + """ + + # Mole fraction for each compound + Xi = self.Y2X(Yi) + + # Saturated vapor pressure for each compound (Pa) + p_sati = self.psat(T, correlation=correlation) + + # Mixture vapor pressure via Raoult's law + p_v = p_sati @ Xi + + return p_v + + def mixture_vapor_pressure_antoine_coeffs( + self, Yi, Tvals=None, units="mks", correlation="Lee-Kesler" + ): + """ + Estimate Antoine coefficients for vapor pressure of the mixture. + + :param Yi: Mass fractions of each compound in the mixture. + :type Yi: np.ndarray + :param Tvals: Temperature range or nodes for Antoine fit in Kelvin (default [273.15, min(Tb)]). + :type Tvals: np.ndarray, optional + :param units: Units for pressure in fit ("mks", "cgs", "bar", "atm") + :type units: str, optional + :param correlation: Correlation method ("Ambrose-Walton" or "Lee-Kesler"). + :type correlation: str, optional + :return: Coefficients A, B, C, D + :rtype: float + """ + + # Define or get temperature nodes for fit + if Tvals is None: + print("Tvals not specified, using [273.15, min(Tb_mix)] for mixture.") + # Initialize as zeros for now, calculated for each compound later + X = self.Y2X(Yi) + Tb = mixing_rule(self.Tb, X) + T = np.linspace(273.15, np.min(Tb), 20) + elif len(Tvals) == 2: + T = np.linspace(Tvals[0], Tvals[1], 20) + elif len(Tvals) > 2: + T = Tvals + else: + raise ValueError("Tvals must be None, length 2, or length > 2.") + + # Antoine equation log10(p) = A - B/(C + T) + def antoine_eq(T, A, B, C): + """ + Antoine equation for vapor pressure. + + :param T: Temperature. + :type T: float or np.ndarray + :param A: Antoine coefficient A. + :type A: float + :param B: Antoine coefficient B. + :type B: float + :param C: Antoine coefficient C. + :type C: float + :return: log10(pressure). + :rtype: float or np.ndarray + """ + return A - B / (T + C) + + # Determine conversion factor for pressure in MKS, CGS, bar, or atm + D = 1 # default is Pa + if units.lower() == "bar": + D = 1e5 + elif units.lower() == "atm": + D = 1.01325e5 + elif units.lower() == "cgs": + D = 1 / 10 # dyne/cm^2 + + Pvals = np.zeros_like(T) + for k in range(len(T)): + Pvals[k] = ( + self.mixture_vapor_pressure(Yi, T[k], correlation=correlation) / D + ) + + logP = np.log10(Pvals) + popt, _ = curve_fit(antoine_eq, T, logP, p0=[1, 1e3, -1]) # initial guess + A, B, C = popt + + return A, B, C, D + + def mixture_surface_tension(self, Yi, T, correlation="Brock-Bird"): + """ + Calculate surface tension of the mixture. + + :meta private: Uses arithmetic pseudo-property method recommended by Hugill and van Welsenes (1986). + + :param Yi: Mass fractions of each compound in the mixture. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :param correlation: Correlation method ("Pitzer" or "Brock-Bird"). + :type correlation: str, optional + :return: Mixture surface tension in N/m. + :rtype: float + """ + + # Mole fraction for each compound + Xi = self.Y2X(Yi) + + # Surface tension for each compound (N/m) + sti = self.surface_tension(T, correlation=correlation) + + # Mixture surface tension via arithmetic mean, Poling (12-5.2) + st = mixing_rule(sti, Xi, "arithmetic") + + return st + + def mixture_thermal_conductivity(self, Yi, T): + """ + Calculate thermal conductivity of the mixture. + + :param Yi: Mass fractions of each compound in the mixture. + :type Yi: np.ndarray + :param T: Temperature in Kelvin. + :type T: float + :return: Thermal conductivity in W/m/K. + :rtype: float + """ + tc = self.thermal_conductivity(T) + return np.sum(Yi * tc ** (-2)) ** (-0.5) + + +__all__ = ["fuel"] diff --git a/fuellib/utilities.py b/fuellib/utilities.py new file mode 100644 index 0000000..3fc0ea8 --- /dev/null +++ b/fuellib/utilities.py @@ -0,0 +1,67 @@ +"""Utility functions for mixture calculations and droplet properties.""" + +import numpy as np + + +def mixing_rule(var_n, X, pseudo_prop="arithmetic"): + """ + Mixing rules for computing mixture properties. + + :param var_n: Individual compound properties. + :type var_n: np.ndarray + :param X: Mole fractions of the compounds. + :type X: np.ndarray + :param pseudo_prop: Type of mean ("arithmetic" or "geometric"). + :type pseudo_prop: str, optional + :return: Mixture property value. + :rtype: float + """ + num_comps = len(var_n) + var_mix = 0.0 + for i in range(num_comps): + for j in range(num_comps): + if pseudo_prop.casefold() == "geometric": + # Use geometric mean definition for the pseudo property + var_ij = (var_n[i] * var_n[j]) ** (0.5) + else: + # Use arithmetic definition for the pseudo property + var_ij = (var_n[i] + var_n[j]) / 2 + var_mix += X[i] * X[j] * var_ij + return var_mix + + +def droplet_volume(r): + """ + Calculate spherical volume of a droplet given the radius. + + :param r: Radius of the droplet in meters. + :type r: float + :return: Spherical volume of droplet in cubic meters. + :rtype: float + """ + return 4.0 / 3.0 * np.pi * r**3 + + +def droplet_mass(fuel, r, Yi, T): + """ + Calculate the mass of each compound in the fuel provided the radius of the droplet. + + :param fuel: An instance of the fuel class. + :type fuel: fuel object + :param r: Radius of the droplet in meters. + :type r: float + :param Yi: Mass fractions of each compound. + :type Yi: np.ndarray + :param T: Droplet temperature in Kelvin. + :type T: float + :return: Mass of each compound in droplet in kg. + :rtype: np.ndarray + """ + volume = droplet_volume(r) # m^3 + if volume > 0: + return volume / (fuel.molar_liquid_vol(T) @ Yi) * Yi * fuel.MW + else: + return np.zeros_like(fuel.MW) + + +__all__ = ["mixing_rule", "droplet_volume", "droplet_mass"] diff --git a/pyproject.toml b/pyproject.toml index e60b200..c9cba69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,16 +51,16 @@ fl-export-pele = "fuellib.exporters.pele:main" fl-build-docs = "fuellib.build_docs:main" fl-clean-docs = "fuellib.clean_docs:main" fl-format = "fuellib.format_code:main" -fl-eps2K = "fuellib.utilities.transport_props_converter:eps2K_main" -fl-C2K = "fuellib.utilities.temp_converter:c2k_main" -fl-K2C = "fuellib.utilities.temp_converter:k2c_main" -fl-C2F = "fuellib.utilities.temp_converter:c2f_main" -fl-F2C = "fuellib.utilities.temp_converter:f2c_main" -fl-F2K = "fuellib.utilities.temp_converter:f2k_main" -fl-K2F = "fuellib.utilities.temp_converter:k2f_main" -fl-plt-comp = "fuellib.utilities.plotting:comp_main" -fl-plt-props = "fuellib.utilities.plotting:props_main" -fl-fuels = "fuellib.utilities.fuel_manager:list_fuels_main" +fl-eps2K = "fuellib.cli.transport_props_converter:eps2K_main" +fl-C2K = "fuellib.cli.temp_converter:c2k_main" +fl-K2C = "fuellib.cli.temp_converter:k2c_main" +fl-C2F = "fuellib.cli.temp_converter:c2f_main" +fl-F2C = "fuellib.cli.temp_converter:f2c_main" +fl-F2K = "fuellib.cli.temp_converter:f2k_main" +fl-K2F = "fuellib.cli.temp_converter:k2f_main" +fl-plt-comp = "fuellib.cli.plotting:comp_main" +fl-plt-props = "fuellib.cli.plotting:props_main" +fl-fuels = "fuellib.cli._fuel_manager:list_fuels_main" [project.urls] Repository = "https://github.com/NatLabRockies/FuelLib" @@ -68,7 +68,7 @@ Issues = "https://github.com/NatLabRockies/FuelLib/issues" Documentation = "https://NatLabRockies.github.io/FuelLib" [tool.setuptools] -packages = ["fuellib", "fuellib.exporters", "fuellib.utilities"] +packages = ["fuellib", "fuellib.exporters", "fuellib.cli"] [tool.setuptools.package-data] fuellib = [ diff --git a/tests/test_api.py b/tests/test_api.py index 84fad52..96f8821 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -23,11 +23,16 @@ def _normalize_signature(sig): def _public_module_functions(module): - return { - name: obj - for name, obj in inspect.getmembers(module, inspect.isfunction) - if not name.startswith("_") and obj.__module__ == module.__name__ - } + """Get public functions from module, including re-exported ones from __all__.""" + functions = {} + # Check all public names in __all__ + if hasattr(module, "__all__"): + for name in module.__all__: + if not name.startswith("_"): + obj = getattr(module, name, None) + if inspect.isfunction(obj) or inspect.isbuiltin(obj): + functions[name] = obj + return functions def _public_class_methods(cls): @@ -52,6 +57,12 @@ def test_fuellib_module_api(self): "droplet_volume": "(r)", "droplet_mass": "(fuel, r, Yi, T)", "epsilon_to_characteristic_temperature": "(epsilon_j_per_mol)", + "get_fueldata_dir": "()", + "get_fueldata_gc_dir": "()", + "get_fueldata_decomp_dir": "()", + "get_fueldata_props_dir": "()", + "get_decomp_name_from_metadata": "(fuel_name, fuel_data_dir=None)", + "get_props_data_from_metadata": "(fuel_name, fuel_data_dir=None)", } actual = _public_module_functions(fl) From d8903157447c1645e90f38141cabb6d3727f045c Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 17:50:14 -0600 Subject: [PATCH 32/48] BREAKING CHANGES: namespace for convert, utility --- docs/fuelprops.rst | 4 +- docs/sourcecode.rst | 19 ++-- fuellib/__init__.py | 40 ++------ fuellib/cli/temp_converter.py | 14 +-- fuellib/cli/transport_props_converter.py | 4 +- fuellib/constants.py | 7 +- fuellib/{conversions.py => convert.py} | 0 fuellib/fuel.py | 124 +++++++++++++++-------- fuellib/{utilities.py => utility.py} | 0 tests/get_pred_and_data.py | 2 +- tests/test_api.py | 124 ++++++++++++++++------- tests/test_utilities.py | 22 ++-- tutorials/hefaBlends.py | 6 +- tutorials/mixtureProperties.py | 6 +- 14 files changed, 228 insertions(+), 144 deletions(-) rename fuellib/{conversions.py => convert.py} (100%) rename fuellib/{utilities.py => utility.py} (100%) diff --git a/docs/fuelprops.rst b/docs/fuelprops.rst index 0972039..fe65546 100644 --- a/docs/fuelprops.rst +++ b/docs/fuelprops.rst @@ -389,7 +389,7 @@ are used throughout this section. Conventional mixing rules ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autofunction:: fuellib.mixing_rule +.. autofunction:: fuellib.utility.mixing_rule :noindex: While many of the mixture properties in FuelLib have a unique mixing rule, @@ -517,7 +517,7 @@ For ease of reference, the reference compounds and keys corresponding to a PeleP When provided, the PelePhysics keys can be used to link the compounds in FuelLib to species in PelePhysics simulations via ``Export4Pele.py`` as described in :ref:`Exporting to PelePhysics `. .. csv-table:: Reference compounds, chemical formulas, and corresponding PelePhysics keys by GCxGC bin. - :file: ../fuelData/refCompounds.csv + :file: ../fuellib/data/fuelData/refCompounds.csv :header-rows: 1 :align: center :widths: auto diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index b34b9cb..af1aa6e 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -9,18 +9,20 @@ FuelLib File Organization ------------------------- - **docs:** directory containing the documentation source files -- **fuelData:** - - **gcData:** directory containing a collection of GCxGC compositional data by weight percentages - - **groupDecompositionData:** directory containing a collection of functional group decompositions - - **propertiesData:** directory containing measurement or predicted data for validation (see *fuelData/dataReferences.md*) - **gcmTableData:** directory that contains the pre-tabulated group contributions - **fuellib:** main package directory containing: - ``fuel.py``: core :class:`fuel` class for Group Contribution Method calculations - ``constants.py``: physical constants (Boltzmann, Avogadro) - - ``conversions.py``: temperature conversion functions and Lennard-Jones calculations - - ``utilities.py``: utility functions for mixture properties and droplet calculations + - ``convert.py``: temperature conversion functions and Lennard-Jones calculations + - ``utility.py``: utility functions for mixture properties and droplet calculations - ``_data_locator.py``: internal module for locating and validating fuel data directories + - **data**: directory containing fuel data and metadata + - **fuelData:** + - **gcData:** directory containing a collection of GCxGC compositional data by weight percentages + - **groupDecompositionData:** directory containing a collection of functional group decompositions + - **propertiesData:** directory containing measurement or predicted data for validation (see *fuelData/dataReferences.md*) + - ``fuel_metadata.yaml``: YAML file that maps fuel names to their decomposition files and optional metadata fields (see *fuelData/fuel_metadata_template.yaml* for template) - **exporters:** subpackage with CLI exporters for generating fuel properties - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) @@ -66,4 +68,7 @@ Click on links below for the full auto-documentation of the API. .. autosummary:: :toctree: generated - fuellib \ No newline at end of file + fuellib.fuel + fuellib.constants + fuellib.convert + fuellib.utility \ No newline at end of file diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 96b95cb..2354dab 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -17,51 +17,33 @@ # Import constants from .constants import k_B, N_A -# Import temperature conversions and characteristic temperature -from .conversions import ( - C2K, - K2C, - C2F, - F2C, - F2K, - K2F, - epsilon_to_characteristic_temperature, -) - -# Import utility functions -from .utilities import mixing_rule, droplet_volume, droplet_mass - # Import fuel class from .fuel import fuel -# Import data locator functions +# Import data locator functions for convenience from ._data_locator import ( get_fueldata_dir, get_fueldata_gc_dir, get_fueldata_decomp_dir, get_fueldata_props_dir, - get_decomp_name_from_metadata, - get_props_data_from_metadata, + get_gcmtable_dir, ) +# Import submodules for namespacing +from . import constants +from . import convert +from . import utility + __all__ = [ "fuel", "k_B", "N_A", - "C2K", - "K2C", - "C2F", - "F2C", - "F2K", - "K2F", - "epsilon_to_characteristic_temperature", - "mixing_rule", - "droplet_volume", - "droplet_mass", "get_fueldata_dir", "get_fueldata_gc_dir", "get_fueldata_decomp_dir", "get_fueldata_props_dir", - "get_decomp_name_from_metadata", - "get_props_data_from_metadata", + "get_gcmtable_dir", + "constants", + "convert", + "utility", ] diff --git a/fuellib/cli/temp_converter.py b/fuellib/cli/temp_converter.py index 5d79a68..f434e3c 100644 --- a/fuellib/cli/temp_converter.py +++ b/fuellib/cli/temp_converter.py @@ -1,7 +1,7 @@ """Command-line tools to convert temperatures.""" import sys -from .. import C2K, K2C, C2F, F2C, F2K, K2F +from .. import convert def c2k_main(): @@ -13,7 +13,7 @@ def c2k_main(): try: temp_c = float(sys.argv[1]) - result = C2K(temp_c) + result = convert.C2K(temp_c) print(f"{temp_c} °C = {result:.2f} K") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") @@ -29,7 +29,7 @@ def k2c_main(): try: temp_k = float(sys.argv[1]) - result = K2C(temp_k) + result = convert.K2C(temp_k) print(f"{temp_k} K = {result:.2f} °C") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") @@ -45,7 +45,7 @@ def c2f_main(): try: temp_c = float(sys.argv[1]) - result = C2F(temp_c) + result = convert.C2F(temp_c) print(f"{temp_c} °C = {result:.2f} °F") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") @@ -61,7 +61,7 @@ def f2c_main(): try: temp_f = float(sys.argv[1]) - result = F2C(temp_f) + result = convert.F2C(temp_f) print(f"{temp_f} °F = {result:.2f} °C") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") @@ -77,7 +77,7 @@ def f2k_main(): try: temp_f = float(sys.argv[1]) - result = F2K(temp_f) + result = convert.F2K(temp_f) print(f"{temp_f} °F = {result:.2f} K") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") @@ -93,7 +93,7 @@ def k2f_main(): try: temp_k = float(sys.argv[1]) - result = K2F(temp_k) + result = convert.K2F(temp_k) print(f"{temp_k} K = {result:.2f} °F") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") diff --git a/fuellib/cli/transport_props_converter.py b/fuellib/cli/transport_props_converter.py index b806550..043c4f3 100644 --- a/fuellib/cli/transport_props_converter.py +++ b/fuellib/cli/transport_props_converter.py @@ -1,7 +1,7 @@ """Command-line tool to convert transport properties for combustion simulations.""" import sys -from .. import epsilon_to_characteristic_temperature +from .. import convert def eps2K_main(): @@ -13,7 +13,7 @@ def eps2K_main(): try: epsilon = float(sys.argv[1]) - result = epsilon_to_characteristic_temperature(epsilon) + result = convert.epsilon_to_characteristic_temperature(epsilon) print(f"Characteristic temperature: {result:.3f} K") except ValueError: print(f"Error: '{sys.argv[1]}' is not a valid number") diff --git a/fuellib/constants.py b/fuellib/constants.py index 1dac3e8..d5a7b71 100644 --- a/fuellib/constants.py +++ b/fuellib/constants.py @@ -1,7 +1,10 @@ """Physical constants used in FuelLib calculations.""" # Physical constants -k_B = 1.380649e-23 # Boltzmann's constant in J/K -N_A = 6.02214076e23 # Avogadro's number in 1/mol +#: Boltzmann's constant in J/K. +k_B = 1.380649e-23 + +#: Avogadro's number in 1/mol. +N_A = 6.02214076e23 __all__ = ["k_B", "N_A"] diff --git a/fuellib/conversions.py b/fuellib/convert.py similarity index 100% rename from fuellib/conversions.py rename to fuellib/convert.py diff --git a/fuellib/fuel.py b/fuellib/fuel.py index 45d33e7..7b25ad1 100644 --- a/fuellib/fuel.py +++ b/fuellib/fuel.py @@ -6,8 +6,8 @@ from scipy.optimize import curve_fit from .constants import k_B, N_A -from .conversions import K2C -from .utilities import mixing_rule +from .convert import K2C +from .utility import mixing_rule from ._data_locator import ( get_gcmtable_dir, get_fueldata_dir, @@ -28,59 +28,101 @@ class fuel: :type decompName: str, optional :param fuelDataDir: Directory where the fuel data is stored. If None, uses built-in embedded data. :type fuelDataDir: str, optional + """ - **Data Directory Attributes:** + # Type annotations for documented attributes + #: Root directory for fuel data (custom or embedded) + fuelDataDir: str - :ivar fuelDataDir: Root directory for fuel data (custom or embedded). - :ivar fuelDataGcDir: Directory containing GCxGC compositional data files. - :ivar fuelDataDecompDir: Directory containing functional group decomposition files. - :ivar fuelDataPropsDir: Directory containing experimental property data (may be None). + #: Directory containing GCxGC compositional data files + fuelDataGcDir: str - **Composition Attributes:** + #: Directory containing functional group decomposition files + fuelDataDecompDir: str - :ivar name: Name of the fuel/mixture. - :ivar compounds: List of compound names in the mixture. - :ivar formulas: Molecular formulas for each compound (if available). - :ivar Y_0: Mass fractions of each compound (array, shape: num_compounds). - :ivar Nij: Functional group decomposition matrix (array, shape: num_compounds × num_groups). - :ivar num_compounds: Number of compounds in the mixture. - :ivar num_groups: Number of functional groups in the decomposition. + #: Directory containing experimental property data (may be None) + fuelDataPropsDir: str - **Pure Component Properties (Critical, Molecular):** + #: Name of the fuel/mixture + name: str - :ivar MW: Molecular weights in kg/mol (array, shape: num_compounds). - :ivar Tc: Critical temperatures in K (array, shape: num_compounds). - :ivar Pc: Critical pressures in Pa (array, shape: num_compounds). - :ivar Vc: Critical volumes in m³/mol (array, shape: num_compounds). - :ivar Tb: Boiling temperatures in K (array, shape: num_compounds). - :ivar Tm: Melting temperatures in K (array, shape: num_compounds). + #: List of compound names in the mixture + compounds: list - **Thermodynamic Properties (at 298.15 K):** + #: Molecular formulas for each compound + formulas: np.ndarray - :ivar Hf: Enthalpy of formation in J/mol (array, shape: num_compounds). - :ivar Gf: Gibbs free energy in J/mol (array, shape: num_compounds). - :ivar Hv_stp: Enthalpy of vaporization at 298 K in J/mol (array, shape: num_compounds). - :ivar Lv_stp: Latent heat of vaporization at 298 K in J/kg (array, shape: num_compounds). - :ivar Cp_stp: Molar specific heat at 298 K in J/mol/K (array, shape: num_compounds). - :ivar Vm_stp: Molar liquid volume at 298 K in m³/mol (array, shape: num_compounds). - :ivar omega: Acentric factors (array, shape: num_compounds). + #: Mass fractions of each compound. Shape: (num_compounds,) + Y_0: np.ndarray - **Lennard-Jones Transport Parameters:** + #: Functional group decomposition matrix. Shape: (num_compounds, num_groups) + Nij: np.ndarray - :ivar sigma: Lennard-Jones collision diameters in m (array, shape: num_compounds). - :ivar epsilonByKB: Lennard-Jones well depths in K (array, shape: num_compounds). + #: Number of compounds in the mixture + num_compounds: int - **Classification Attributes:** + #: Number of functional groups in the decomposition + num_groups: int - :ivar hc_type: Hydrocarbon types ("n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene"). - :ivar fam: Family codes for thermal conductivity (0: saturated, 1: aromatic, 2: cycloparaffin, 3: olefin). - :ivar nC: Carbon numbers (array, shape: num_compounds). - :ivar nH: Hydrogen numbers (array, shape: num_compounds). + #: Molecular weights in kg/mol. Shape: (num_compounds,) + MW: np.ndarray - **Optional Attributes:** + #: Critical temperatures in K. Shape: (num_compounds,) + Tc: np.ndarray - :ivar pelephysics_keys: PelePhysics keys for each compound (if available). - """ + #: Critical pressures in Pa. Shape: (num_compounds,) + Pc: np.ndarray + + #: Critical volumes in m³/mol. Shape: (num_compounds,) + Vc: np.ndarray + + #: Boiling temperatures in K. Shape: (num_compounds,) + Tb: np.ndarray + + #: Melting temperatures in K. Shape: (num_compounds,) + Tm: np.ndarray + + #: Enthalpy of formation in J/mol. Shape: (num_compounds,) + Hf: np.ndarray + + #: Gibbs free energy in J/mol. Shape: (num_compounds,) + Gf: np.ndarray + + #: Enthalpy of vaporization at 298 K in J/mol. Shape: (num_compounds,) + Hv_stp: np.ndarray + + #: Latent heat of vaporization at 298 K in J/kg. Shape: (num_compounds,) + Lv_stp: np.ndarray + + #: Molar specific heat at 298 K in J/mol/K. Shape: (num_compounds,) + Cp_stp: np.ndarray + + #: Molar liquid volume at 298 K in m³/mol. Shape: (num_compounds,) + Vm_stp: np.ndarray + + #: Acentric factors. Shape: (num_compounds,) + omega: np.ndarray + + #: Lennard-Jones collision diameters in m. Shape: (num_compounds,) + sigma: np.ndarray + + #: Lennard-Jones well depths in K. Shape: (num_compounds,) + epsilonByKB: np.ndarray + + #: Hydrocarbon types ("n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene") + hc_type: np.ndarray + + #: Family codes for thermal conductivity (0: saturated, 1: aromatic, 2: cycloparaffin, 3: olefin) + fam: np.ndarray + + #: Carbon numbers. Shape: (num_compounds,) + nC: np.ndarray + + #: Hydrogen numbers. Shape: (num_compounds,) + nH: np.ndarray + + #: PelePhysics keys for each compound (if available) + pelephysics_keys: np.ndarray # Number of first and second order groups from Constantinou and Gani N_g1 = 78 diff --git a/fuellib/utilities.py b/fuellib/utility.py similarity index 100% rename from fuellib/utilities.py rename to fuellib/utility.py diff --git a/tests/get_pred_and_data.py b/tests/get_pred_and_data.py index 1ec0b6b..e567818 100644 --- a/tests/get_pred_and_data.py +++ b/tests/get_pred_and_data.py @@ -23,7 +23,7 @@ def get_pred_and_data(fuel_name, prop_name): pred = np.zeros_like(T_data) # Vectors for temperature (convert from C to K) - T_pred = fl.C2K(T_data) + T_pred = fl.convert.C2K(T_data) for i in range(0, len(T_pred)): Y_li = fuel.Y_0 diff --git a/tests/test_api.py b/tests/test_api.py index 96f8821..ac69a4c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,4 +1,5 @@ import inspect +import types import unittest import numpy as np @@ -46,44 +47,95 @@ def _public_class_methods(cls): class ApiContractTestCase(unittest.TestCase): def test_fuellib_module_api(self): print("\nFuelLib Module API:") - expected = { + expected_top_level = { + "fuel": "class", + "k_B": "constant", + "N_A": "constant", + "constants": "module", + "convert": "module", + "utility": "module", + } + + # Check top-level API + for name, obj_type in expected_top_level.items(): + self.assertTrue( + hasattr(fl, name), + msg=f"FuelLib module missing expected attribute: {name}", + ) + if obj_type == "class": + self.assertTrue( + inspect.isclass(getattr(fl, name)), + msg=f"FuelLib.{name} should be a class", + ) + elif obj_type == "module": + import types + + self.assertTrue( + isinstance(getattr(fl, name), types.ModuleType), + msg=f"FuelLib.{name} should be a module", + ) + print(f" ✓ {name} ({obj_type})") + + # Check convert submodule + print("\nFuelLib.convert Module API:") + convert_funcs = { "C2K": "(T)", "K2C": "(T)", "C2F": "(T)", "F2C": "(T)", "F2K": "(T)", "K2F": "(T)", + "epsilon_to_characteristic_temperature": "(epsilon_j_per_mol)", + } + for name, sig_expected in convert_funcs.items(): + self.assertTrue( + hasattr(fl.convert, name), msg=f"fuellib.convert missing: {name}" + ) + func = getattr(fl.convert, name) + actual_sig = _normalize_signature(inspect.signature(func)) + self.assertEqual( + actual_sig, + sig_expected, + msg=f"fuellib.convert.{name} signature changed", + ) + print(f" ✓ {name}{actual_sig}") + + # Check utility submodule + print("\nFuelLib.utility Module API:") + utility_funcs = { "mixing_rule": "(var_n, X, pseudo_prop='arithmetic')", "droplet_volume": "(r)", "droplet_mass": "(fuel, r, Yi, T)", - "epsilon_to_characteristic_temperature": "(epsilon_j_per_mol)", - "get_fueldata_dir": "()", - "get_fueldata_gc_dir": "()", - "get_fueldata_decomp_dir": "()", - "get_fueldata_props_dir": "()", - "get_decomp_name_from_metadata": "(fuel_name, fuel_data_dir=None)", - "get_props_data_from_metadata": "(fuel_name, fuel_data_dir=None)", } - - actual = _public_module_functions(fl) - self.assertEqual( - set(actual.keys()), - set(expected.keys()), - msg=( - "FuelLib module public function list changed. " - f"Expected: {sorted(expected.keys())}; Found: {sorted(actual.keys())}" - ), - ) - - for name in sorted(expected.keys()): - actual_sig = _normalize_signature(inspect.signature(actual[name])) + for name, sig_expected in utility_funcs.items(): + self.assertTrue( + hasattr(fl.utility, name), msg=f"fuellib.utility missing: {name}" + ) + func = getattr(fl.utility, name) + actual_sig = _normalize_signature(inspect.signature(func)) self.assertEqual( actual_sig, - expected[name], - msg=f"FuelLib module function signature changed: {name}", + sig_expected, + msg=f"fuellib.utility.{name} signature changed", ) print(f" ✓ {name}{actual_sig}") + # Check constants submodule + print("\nFuelLib.constants Module API:") + constants_vals = { + "k_B": "Boltzmann constant", + "N_A": "Avogadro number", + } + for name in constants_vals.keys(): + self.assertTrue( + hasattr(fl.constants, name), msg=f"fuellib.constants missing: {name}" + ) + val = getattr(fl.constants, name) + self.assertIsInstance( + val, (int, float), msg=f"fuellib.constants.{name} should be numeric" + ) + print(f" ✓ {name}") + def test_fuellib_class_api(self): print("\nFuelLib.fuel Class API:") expected = { @@ -162,24 +214,24 @@ def test_all_fuel_methods_for_single_and_multicomponent(self): # Utility functions (run per fuel for consistent CI grouping) print(" Utility Functions:") - self.assertAlmostEqual(fl.C2K(25.0), 298.15) - print(" ✓ C2K") - self.assertAlmostEqual(fl.K2C(298.15), 25.0) - print(" ✓ K2C") + self.assertAlmostEqual(fl.convert.C2K(25.0), 298.15) + print(" ✓ convert.C2K") + self.assertAlmostEqual(fl.convert.K2C(298.15), 25.0) + print(" ✓ convert.K2C") self.assertAlmostEqual( - fl.droplet_volume(1e-4), 4.0 / 3.0 * np.pi * (1e-4) ** 3 + fl.utility.droplet_volume(1e-4), 4.0 / 3.0 * np.pi * (1e-4) ** 3 ) - print(" ✓ droplet_volume") + print(" ✓ utility.droplet_volume") Xi = fuel.Y2X(Yi) self._assert_finite_and_positive( - fl.mixing_rule(fuel.Tc, Xi, pseudo_prop="arithmetic") + fl.utility.mixing_rule(fuel.Tc, Xi, pseudo_prop="arithmetic") ) - print(" ✓ mixing_rule (arithmetic)") + print(" ✓ utility.mixing_rule (arithmetic)") self._assert_finite_and_positive( - fl.mixing_rule(fuel.Tc, Xi, pseudo_prop="geometric") + fl.utility.mixing_rule(fuel.Tc, Xi, pseudo_prop="geometric") ) - print(" ✓ mixing_rule (geometric)") + print(" ✓ utility.mixing_rule (geometric)") # Composition conversion methods print(" Composition Conversions:") @@ -339,13 +391,13 @@ def test_all_fuel_methods_for_single_and_multicomponent(self): # Droplet helpers print(" Droplet Properties:") - m = fl.droplet_mass(fuel, 2.0e-5, Yi, self.T) + m = fl.utility.droplet_mass(fuel, 2.0e-5, Yi, self.T) self.assertEqual(m.shape, fuel.MW.shape) self.assertTrue(np.all(m >= 0.0)) self.assertTrue( - np.allclose(fl.droplet_mass(fuel, 0.0, Yi, self.T), 0.0) + np.allclose(fl.utility.droplet_mass(fuel, 0.0, Yi, self.T), 0.0) ) - print(" ✓ droplet_mass") + print(" ✓ utility.droplet_mass") if __name__ == "__main__": diff --git a/tests/test_utilities.py b/tests/test_utilities.py index 629bceb..e4e8360 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -15,44 +15,44 @@ def test_epsilon_to_characteristic_temperature(self): # epsilon = 1000 J/mol # epsilon_molecule = 1000 / 6.02214076e23 J # T* = epsilon_molecule / k_B = (1000 / 6.02214076e23) / 1.380649e-23 K - result = fl.epsilon_to_characteristic_temperature(1000.0) + result = fl.convert.epsilon_to_characteristic_temperature(1000.0) expected = (1000.0 / fl.N_A) / fl.k_B self.assertAlmostEqual(result, expected, places=10) def test_epsilon_to_characteristic_temperature_zero(self): """Test epsilon conversion with zero input.""" - result = fl.epsilon_to_characteristic_temperature(0.0) + result = fl.convert.epsilon_to_characteristic_temperature(0.0) self.assertEqual(result, 0.0) def test_epsilon_to_characteristic_temperature_negative(self): """Test epsilon conversion with negative input.""" - result = fl.epsilon_to_characteristic_temperature(-1000.0) + result = fl.convert.epsilon_to_characteristic_temperature(-1000.0) expected = (-1000.0 / fl.N_A) / fl.k_B self.assertAlmostEqual(result, expected, places=10) def test_C2K(self): """Test Celsius to Kelvin conversion.""" # 0°C = 273.15 K - self.assertAlmostEqual(fl.C2K(0.0), 273.15, places=10) + self.assertAlmostEqual(fl.convert.C2K(0.0), 273.15, places=10) # 25°C = 298.15 K - self.assertAlmostEqual(fl.C2K(25.0), 298.15, places=10) + self.assertAlmostEqual(fl.convert.C2K(25.0), 298.15, places=10) # 100°C = 373.15 K - self.assertAlmostEqual(fl.C2K(100.0), 373.15, places=10) + self.assertAlmostEqual(fl.convert.C2K(100.0), 373.15, places=10) def test_K2C(self): """Test Kelvin to Celsius conversion.""" # 273.15 K = 0°C - self.assertAlmostEqual(fl.K2C(273.15), 0.0, places=10) + self.assertAlmostEqual(fl.convert.K2C(273.15), 0.0, places=10) # 298.15 K = 25°C - self.assertAlmostEqual(fl.K2C(298.15), 25.0, places=10) + self.assertAlmostEqual(fl.convert.K2C(298.15), 25.0, places=10) # 373.15 K = 100°C - self.assertAlmostEqual(fl.K2C(373.15), 100.0, places=10) + self.assertAlmostEqual(fl.convert.K2C(373.15), 100.0, places=10) def test_C2K_K2C_roundtrip(self): """Test roundtrip conversion between Celsius and Kelvin.""" original_c = 42.5 - kelvin = fl.C2K(original_c) - result_c = fl.K2C(kelvin) + kelvin = fl.convert.C2K(original_c) + result_c = fl.convert.K2C(kelvin) self.assertAlmostEqual(result_c, original_c, places=10) diff --git a/tutorials/hefaBlends.py b/tutorials/hefaBlends.py index 97a06af..48ffff5 100644 --- a/tutorials/hefaBlends.py +++ b/tutorials/hefaBlends.py @@ -69,9 +69,9 @@ def getPredAndData(fuel_name, prop_name, blend): # Separate properties and associated temperatures from data if prop_name == "Density": - T = fl.C2K(15) + T = fl.convert.C2K(15) elif prop_name == "Viscosity": - T = fl.C2K(-20) + T = fl.convert.C2K(-20) # Vector for FuelLib predictions prop_pred = np.zeros_like(blend) @@ -139,7 +139,7 @@ def getPredAndData(fuel_name, prop_name, blend): # Add labels and adjust ticks ax[i].set_xlabel("HEFA Concentration [wt %]", fontsize=fsize) ax[i].set_xticks([0, 20, 40, 60, 80, 100]) - ax[i].set_ylabel(ylab(prop_names[i], fl.K2C(T)), fontsize=fsize) + ax[i].set_ylabel(ylab(prop_names[i], fl.convert.K2C(T)), fontsize=fsize) ax[i].tick_params(labelsize=ticksize) handles, labels = ax[0].get_legend_handles_labels() diff --git a/tutorials/mixtureProperties.py b/tutorials/mixtureProperties.py index 72fc367..08923d3 100644 --- a/tutorials/mixtureProperties.py +++ b/tutorials/mixtureProperties.py @@ -91,14 +91,14 @@ def getPredAndData(fuel_name, prop_name): T_data = data.Temperature[data[prop_name].notna()] prop_data = data[prop_name].dropna() # Vectors for temperature (convert from C to K) - T_pred = fl.C2K(np.linspace(min(T_data), max(T_data), 100)) + T_pred = fl.convert.C2K(np.linspace(min(T_data), max(T_data), 100)) except (FileNotFoundError, KeyError): # If propertyData is not found, set temp min/max from xticks_posf T_data = pd.Series(dtype=float) prop_data = pd.Series(dtype=float) temp_min = min(xticks_posf[prop_name]) temp_max = max(xticks_posf[prop_name]) - T_pred = fl.C2K(np.linspace(temp_min, temp_max, 100)) + T_pred = fl.convert.C2K(np.linspace(temp_min, temp_max, 100)) # Vectors for density, viscosity and vapor pressure pred = np.zeros_like(T_pred) @@ -142,7 +142,7 @@ def getPredAndData(fuel_name, prop_name): # Plot GCM predictions and data ax[i].plot( - fl.K2C(T), + fl.convert.K2C(T), pred, "-", color=line_color, From bdc8a09fe6d44b8195b8a7184cce10e7c424288c Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 22:21:20 -0600 Subject: [PATCH 33/48] Fix exporter test --- .github/workflows/ci.yml | 15 +---- fuellib/exporters/converge.py | 10 ++-- fuellib/exporters/pele.py | 20 +++---- tests/test_exporters.py | 110 ++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 tests/test_exporters.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80581bf..68ff807 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,18 +111,5 @@ jobs: - run: | python -m pip install --upgrade pip pip install -e . - - name: fl-export-pele - individual component export - run: fl-export-pele -f posf10264 - - name: fl-export-pele - mixture export with GCM model - run: fl-export-pele -f posf10264 -m true - - name: fl-export-pele - mixture export with MP model - run: fl-export-pele -f posf10264 -m true -l mp - - name: fl-export-pele - mixture export with CGS units - run: fl-export-pele -f posf10264 -m true -u cgs - - name: fl-export-pele - single deposit species - run: fl-export-pele -f posf10264 -dep POSF10264 - - name: fl-export-converge - individual component export - run: fl-export-converge -f posf10264 - - name: fl-export-converge - mixture export - run: fl-export-converge -f posf10264 -m true -t 280 -T 400 -s 10 + - run: python tests/test_exporters.py diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index 0f8aedb..dc4d0f6 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -343,8 +343,10 @@ def calculate_mixture_properties(T_array, fuel): thermal_conductivity[k] = fuel.mixture_thermal_conductivity(Y_li, Temp) # Generic mixing rules for latent heat and specific heat - Lv[k] = fl.mixing_rule(fuel.latent_heat_vaporization(Temp), X_li) # J/kg - Cl[k] = fl.mixing_rule(fuel.Cl(Temp), X_li) # J/kg/K + Lv[k] = fl.utility.mixing_rule( + fuel.latent_heat_vaporization(Temp), X_li + ) # J/kg + Cl[k] = fl.utility.mixing_rule(fuel.Cl(Temp), X_li) # J/kg/K return mu, surface_tension, Lv, pv, rho, Cl, thermal_conductivity @@ -411,8 +413,8 @@ def export_properties_to_csv(file_path, data_dict, overwrite=True): T = np.linspace(temp_min, temp_max, nT) # Estimate freezing point and critical temp of mixture - T_freeze = fl.mixing_rule(fuel.Tm, fuel.Y2X(fuel.Y_0)) - T_crit = fl.mixing_rule(fuel.Tc, fuel.Y2X(fuel.Y_0)) + T_freeze = fl.utility.mixing_rule(fuel.Tm, fuel.Y2X(fuel.Y_0)) + T_crit = fl.utility.mixing_rule(fuel.Tc, fuel.Y2X(fuel.Y_0)) print(f"\nEstimated mixture freezing temp: {T_freeze:.2f} K") print(f"Min freezing temp min(Tm_i): {min(fuel.Tm):.2f} K") diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index 338729a..cf44b23 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -187,9 +187,9 @@ def create_mixture_dataframe(fuel, export_mix_name, converter): # Cp(T) = Cp_A + Cp_B * theta + Cp_C * theta^2 # where theta = (T - 298.15) / 700 X = fuel.Y2X(fuel.Y_0) - Cp_A = fl.mixing_rule(fuel.Cp_stp / fuel.MW, X) - Cp_B = fl.mixing_rule(fuel.Cp_B / fuel.MW, X) - Cp_C = fl.mixing_rule(fuel.Cp_C / fuel.MW, X) + Cp_A = fl.utility.mixing_rule(fuel.Cp_stp / fuel.MW, X) + Cp_B = fl.utility.mixing_rule(fuel.Cp_B / fuel.MW, X) + Cp_C = fl.utility.mixing_rule(fuel.Cp_C / fuel.MW, X) return pd.DataFrame( { @@ -197,17 +197,17 @@ def create_mixture_dataframe(fuel, export_mix_name, converter): "Family": [st.mode(fuel.fam).mode], "Y_0": [1.0], "MW": [fuel.mean_molecular_weight(fuel.Y_0) * converter.MW], - "Tc": [fl.mixing_rule(fuel.Tc, X)], - "Pc": [fl.mixing_rule(fuel.Pc, X) * converter.P], - "Vc": [fl.mixing_rule(fuel.Vc, X) * converter.Vm], - "Tb": [fl.mixing_rule(fuel.Tb, X)], - "omega": [fl.mixing_rule(fuel.omega, X)], - "Vm_stp": [fl.mixing_rule(fuel.Vm_stp, X) * converter.Vm], + "Tc": [fl.utility.mixing_rule(fuel.Tc, X)], + "Pc": [fl.utility.mixing_rule(fuel.Pc, X) * converter.P], + "Vc": [fl.utility.mixing_rule(fuel.Vc, X) * converter.Vm], + "Tb": [fl.utility.mixing_rule(fuel.Tb, X)], + "omega": [fl.utility.mixing_rule(fuel.omega, X)], + "Vm_stp": [fl.utility.mixing_rule(fuel.Vm_stp, X) * converter.Vm], "Cp_A": [Cp_A * converter.Cp], "Cp_B": [Cp_B * converter.Cp], "Cp_C": [Cp_C * converter.Cp], "Cp_stp": [Cp_A * converter.Cp], # For MP model: Cp_stp = Cp_A - "Lv_stp": [fl.mixing_rule(fuel.Lv_stp, X) * converter.Lv], + "Lv_stp": [fl.utility.mixing_rule(fuel.Lv_stp, X) * converter.Lv], } ) diff --git a/tests/test_exporters.py b/tests/test_exporters.py new file mode 100644 index 0000000..d3bb649 --- /dev/null +++ b/tests/test_exporters.py @@ -0,0 +1,110 @@ +"""Test exporters for FuelLib. + +This test module verifies that the export CLI commands work correctly. +""" + +import subprocess +import sys + + +def run_export_command(cmd): + """Run an export command and verify it succeeds. + + :param cmd: Command to run as a list of strings. + :type cmd: list + :raises RuntimeError: If the command fails. + """ + try: + result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) + if result.returncode != 0: + print(f"Command failed: {' '.join(cmd)}") + print(f"stdout: {result.stdout}") + print(f"stderr: {result.stderr}") + raise RuntimeError(f"Export command failed: {' '.join(cmd)}") + print(f"✓ {' '.join(cmd)}") + except subprocess.TimeoutExpired: + raise RuntimeError(f"Export command timed out: {' '.join(cmd)}") + + +def test_pele_individual_component(): + """Test fl-export-pele individual component export.""" + run_export_command(["fl-export-pele", "-f", "posf10264"]) + + +def test_pele_mixture_gcm(): + """Test fl-export-pele mixture export with GCM model.""" + run_export_command(["fl-export-pele", "-f", "posf10264", "-m", "true"]) + + +def test_pele_mixture_mp(): + """Test fl-export-pele mixture export with MP model.""" + run_export_command(["fl-export-pele", "-f", "posf10264", "-m", "true", "-l", "mp"]) + + +def test_pele_mixture_cgs(): + """Test fl-export-pele mixture export with CGS units.""" + run_export_command(["fl-export-pele", "-f", "posf10264", "-m", "true", "-u", "cgs"]) + + +def test_pele_deposit_species(): + """Test fl-export-pele single deposit species.""" + run_export_command(["fl-export-pele", "-f", "posf10264", "-dep", "POSF10264"]) + + +def test_converge_individual_component(): + """Test fl-export-converge individual component export.""" + run_export_command(["fl-export-converge", "-f", "posf10264"]) + + +def test_converge_mixture(): + """Test fl-export-converge mixture export.""" + run_export_command( + [ + "fl-export-converge", + "-f", + "posf10264", + "-m", + "true", + "-t", + "280", + "-T", + "400", + "-s", + "10", + ] + ) + + +if __name__ == "__main__": + print("Running exporter tests...\n") + + tests = [ + ( + "fl-export-pele - individual component export", + test_pele_individual_component, + ), + ("fl-export-pele - mixture export with GCM model", test_pele_mixture_gcm), + ("fl-export-pele - mixture export with MP model", test_pele_mixture_mp), + ("fl-export-pele - mixture export with CGS units", test_pele_mixture_cgs), + ("fl-export-pele - single deposit species", test_pele_deposit_species), + ( + "fl-export-converge - individual component export", + test_converge_individual_component, + ), + ("fl-export-converge - mixture export", test_converge_mixture), + ] + + failed = [] + for test_name, test_func in tests: + try: + test_func() + except Exception as e: + print(f"✗ {test_name}: {e}") + failed.append(test_name) + + print(f"\n{len(tests) - len(failed)}/{len(tests)} tests passed") + if failed: + print("Failed tests:") + for test_name in failed: + print(f" - {test_name}") + sys.exit(1) From 622917915c294391c51893d308d88132ae9755e4 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 22:25:05 -0600 Subject: [PATCH 34/48] Update version to v3.0.0a1 after breaking changes --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c9cba69..2aa89f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "2.1.2a4" +version = "3.0.0a1" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} From 0cd08f76bae0c4987ab1311fb2b554ca8de5b04f Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 23:03:58 -0600 Subject: [PATCH 35/48] Fix docstrings test --- tests/test_source_docstrings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index 4cb4378..c240cf6 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -69,9 +69,12 @@ class SourceDocstringContractTestCase(unittest.TestCase): def test_source_function_documentation(self): fuellib_dir = Path(__file__).resolve().parents[1] / "fuellib" - # Check main module, exporter scripts, and CLI entry points + # Check main module, public API modules, exporter scripts, and CLI entry points py_files = [ fuellib_dir / "__init__.py", + fuellib_dir / "fuel.py", + fuellib_dir / "convert.py", + fuellib_dir / "utility.py", fuellib_dir / "exporters" / "pele.py", fuellib_dir / "exporters" / "converge.py", fuellib_dir / "build_docs.py", From 416a0e135e0b6b253dc3d111ba94da786b7fed79 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Fri, 15 May 2026 23:22:29 -0600 Subject: [PATCH 36/48] Move dev tools to cli --- docs/sourcecode.rst | 11 +++++++---- fuellib/{ => cli}/build_docs.py | 7 +++++-- fuellib/{ => cli}/clean_docs.py | 7 +++++-- fuellib/{ => cli}/format_code.py | 7 +++++-- fuellib/cli/{_fuel_manager.py => fuel_manager.py} | 0 pyproject.toml | 8 ++++---- tests/test_source_docstrings.py | 7 ++++--- 7 files changed, 30 insertions(+), 17 deletions(-) rename fuellib/{ => cli}/build_docs.py (87%) rename fuellib/{ => cli}/clean_docs.py (86%) rename fuellib/{ => cli}/format_code.py (83%) rename fuellib/cli/{_fuel_manager.py => fuel_manager.py} (100%) diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index af1aa6e..4e1bf19 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -30,10 +30,13 @@ FuelLib File Organization - **cli:** subpackage with command-line interface tools for data conversion and analysis - - ``temp_converter.py``: temperature conversion utilities (CLI: ``fl-C2K``, ``fl-K2C``, ``fl-C2F``, ``fl-F2C``, ``fl-F2K``, ``fl-K2F``) - - ``transport_props_converter.py``: Lennard-Jones parameter conversion (CLI: ``fl-eps2K``) - - ``plotting.py``: plotting utilities for composition and properties (CLI: ``fl-plt-comp``, ``fl-plt-props``) - - ``_fuel_manager.py``: fuel manager utility (CLI: ``fl-fuels``) + - ``temp_converter.py``: temperature conversion utilities + - ``transport_props_converter.py``: transport properties conversion utilities + - ``plotting.py``: plotting utilities for composition and properties + - ``fuel_manager.py``: fuel manager utility + - ``build_docs.py``: documentation builder utility + - ``clean_docs.py``: documentation cleaner utility + - ``format_code.py``: code formatter utility - **tests:** directory containing CI unit tests for FuelLib. The CI test checks if the cumulative error of property predictions of a new proposed model are less than or equal to the current model. diff --git a/fuellib/build_docs.py b/fuellib/cli/build_docs.py similarity index 87% rename from fuellib/build_docs.py rename to fuellib/cli/build_docs.py index 8f6597a..daab646 100644 --- a/fuellib/build_docs.py +++ b/fuellib/cli/build_docs.py @@ -16,8 +16,11 @@ def main(): Changes to the docs directory and runs sphinx-build to generate HTML documentation. """ - # Get the directory of this script (fuellib package) - fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + # Get the directory of this script (fuellib/cli) + cli_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the fuellib package directory (one level up from cli) + fuellib_dir = os.path.dirname(cli_dir) # Get the project root (one level up from fuellib package) project_root = os.path.dirname(fuellib_dir) diff --git a/fuellib/clean_docs.py b/fuellib/cli/clean_docs.py similarity index 86% rename from fuellib/clean_docs.py rename to fuellib/cli/clean_docs.py index ca0b453..d95ef0e 100644 --- a/fuellib/clean_docs.py +++ b/fuellib/cli/clean_docs.py @@ -12,8 +12,11 @@ def main(): Cleans up the Sphinx build output in docs/_build/ and generated documentation in docs/generated/ """ - # Get the directory of this script (fuellib package) - fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + # Get the directory of this script (fuellib/cli) + cli_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the fuellib package directory (one level up from cli) + fuellib_dir = os.path.dirname(cli_dir) # Get the project root (one level up from fuellib package) project_root = os.path.dirname(fuellib_dir) diff --git a/fuellib/format_code.py b/fuellib/cli/format_code.py similarity index 83% rename from fuellib/format_code.py rename to fuellib/cli/format_code.py index 7d846f1..25f958d 100644 --- a/fuellib/format_code.py +++ b/fuellib/cli/format_code.py @@ -7,8 +7,11 @@ def main(): """Run Black formatter on all Python files in the repository.""" - # Get the directory of this script (fuellib package) - fuellib_dir = os.path.dirname(os.path.abspath(__file__)) + # Get the directory of this script (fuellib/cli) + cli_dir = os.path.dirname(os.path.abspath(__file__)) + + # Get the fuellib package directory (one level up from cli) + fuellib_dir = os.path.dirname(cli_dir) # Get the project root (one level up from fuellib package) project_root = os.path.dirname(fuellib_dir) diff --git a/fuellib/cli/_fuel_manager.py b/fuellib/cli/fuel_manager.py similarity index 100% rename from fuellib/cli/_fuel_manager.py rename to fuellib/cli/fuel_manager.py diff --git a/pyproject.toml b/pyproject.toml index 2aa89f3..89303b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,9 +48,9 @@ dev = [ [project.scripts] fl-export-converge = "fuellib.exporters.converge:main" fl-export-pele = "fuellib.exporters.pele:main" -fl-build-docs = "fuellib.build_docs:main" -fl-clean-docs = "fuellib.clean_docs:main" -fl-format = "fuellib.format_code:main" +fl-build-docs = "fuellib.cli.build_docs:main" +fl-clean-docs = "fuellib.cli.clean_docs:main" +fl-format = "fuellib.cli.format_code:main" fl-eps2K = "fuellib.cli.transport_props_converter:eps2K_main" fl-C2K = "fuellib.cli.temp_converter:c2k_main" fl-K2C = "fuellib.cli.temp_converter:k2c_main" @@ -60,7 +60,7 @@ fl-F2K = "fuellib.cli.temp_converter:f2k_main" fl-K2F = "fuellib.cli.temp_converter:k2f_main" fl-plt-comp = "fuellib.cli.plotting:comp_main" fl-plt-props = "fuellib.cli.plotting:props_main" -fl-fuels = "fuellib.cli._fuel_manager:list_fuels_main" +fl-fuels = "fuellib.cli.fuel_manager:list_fuels_main" [project.urls] Repository = "https://github.com/NatLabRockies/FuelLib" diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index c240cf6..bdadbb8 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -77,9 +77,10 @@ def test_source_function_documentation(self): fuellib_dir / "utility.py", fuellib_dir / "exporters" / "pele.py", fuellib_dir / "exporters" / "converge.py", - fuellib_dir / "build_docs.py", - fuellib_dir / "clean_docs.py", - fuellib_dir / "format_code.py", + fuellib_dir / "cli" / "fuel_manager.py", + fuellib_dir / "cli" / "build_docs.py", + fuellib_dir / "cli" / "clean_docs.py", + fuellib_dir / "cli" / "format_code.py", ] total_count = 0 From 052e84c2fb247e2d668fca39021de1ea1c780123 Mon Sep 17 00:00:00 2001 From: Dave Montgomery Date: Tue, 19 May 2026 08:47:23 -0600 Subject: [PATCH 37/48] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .github/workflows/documentation.yml | 2 +- docs/conf.py | 4 +++- docs/index.rst | 2 +- docs/sourcecode.rst | 4 ++-- docs/tutorials-basic.rst | 6 +++--- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 4492efb..97d0a69 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -36,7 +36,7 @@ jobs: - name: Build docs run: | - fl-build-docs + fl-build-docs -W - name: Upload artifact (for PR preview or later steps) uses: actions/upload-artifact@v4 diff --git a/docs/conf.py b/docs/conf.py index f8d8fc1..2b6e702 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,7 +6,9 @@ import sys # Add parent directory to path so we can import fuellib -sys.path.insert(0, os.path.abspath("..")) +DOCS_DIR = os.path.abspath(os.path.dirname(__file__)) +PROJECT_ROOT = os.path.abspath(os.path.join(DOCS_DIR, "..")) +sys.path.insert(0, PROJECT_ROOT) # -- Project information ----------------------------------------------------- diff --git a/docs/index.rst b/docs/index.rst index 4da9144..fc402bc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -52,7 +52,7 @@ After installation, the command-line exporters for exporting fuel data will be a fl-export-pele -h # Export for PelePhysics simulations fl-export-converge -h # Export for Converge simulations -For more detailed information or development setup, see the `Contributing `_ page. +For more detailed information or development setup, see the `Contributing `_ page. **Package Requirements** diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index 4e1bf19..ba2134c 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -21,8 +21,8 @@ FuelLib File Organization - **fuelData:** - **gcData:** directory containing a collection of GCxGC compositional data by weight percentages - **groupDecompositionData:** directory containing a collection of functional group decompositions - - **propertiesData:** directory containing measurement or predicted data for validation (see *fuelData/dataReferences.md*) - - ``fuel_metadata.yaml``: YAML file that maps fuel names to their decomposition files and optional metadata fields (see *fuelData/fuel_metadata_template.yaml* for template) + - **propertiesData:** directory containing measurement or predicted data used for validation + - ``fuel_metadata.yaml``: YAML file that maps fuel names to their decomposition files and optional metadata fields - **exporters:** subpackage with CLI exporters for generating fuel properties - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index 12a1c15..e06ca96 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -25,10 +25,10 @@ Required Input Files FuelLib comes with a variety of built-in fuels with pre-populated input files, but you can also add your own custom fuels by providing the required input files. Each fuel requires two input files: -- ``FuelLib/fuelData/gcData/_init.csv``: the initial weight percentage composition of the fuel components (must include columns "Compound" and "Weight %") -- ``FuelLib/fuelData/groupDecompositionData/.csv``: the fundamental group decomposition for each component of the fuel (must have columns for groups in the same order as `gcmTable `_) +- ``fuellib/data/fuelData/gcData/_init.csv``: the initial weight percentage composition of the fuel components (must include columns "Compound" and "Weight %") +- ``fuellib/data/fuelData/groupDecompositionData/.csv``: the fundamental group decomposition for each component of the fuel (must have columns for groups in the same order as `gcmTable `_) -These two required files must have the same number of rows and the same order of components. Many examples can be found in the `fuelData `_ directory. +These two required files must have the same number of rows and the same order of components. Many examples can be found in the `fuellib/data/fuelData `_ directory in the repository. When working with an installed package, prefer ``fuellib.get_fueldata_dir()`` to discover the local fuel-data directory instead of hard-coding package paths. **Fuel Metadata** From ffe5ac52f572d993cd647b9db21df22a43f0cdcf Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 08:57:45 -0600 Subject: [PATCH 38/48] Implment suggestions from review. --- fuellib/cli/fuel_manager.py | 19 +++++++++++++++---- fuellib/convert.py | 1 - pyproject.toml | 1 + tests/test_source_docstrings.py | 1 + 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/fuellib/cli/fuel_manager.py b/fuellib/cli/fuel_manager.py index e0168e9..7e3095b 100644 --- a/fuellib/cli/fuel_manager.py +++ b/fuellib/cli/fuel_manager.py @@ -7,6 +7,7 @@ import os import argparse +import warnings import fuellib as fl try: @@ -21,7 +22,8 @@ def load_fuel_metadata(fuel_data_dir=None): """ Load fuel metadata from YAML file if available. - :param fuel_data_dir: Optional directory containing fuel data (e.g., customFuels/fuelData). + :param fuel_data_dir: Optional directory containing fuel data (parent of gcData/, + groupDecompositionData/, and fuel_metadata.yaml). If None, loads from embedded FuelLib data. :type fuel_data_dir: str, optional :return: Dictionary of fuel metadata or empty dict if not available @@ -43,8 +45,16 @@ def load_fuel_metadata(fuel_data_dir=None): with open(metadata_file, "r") as f: data = yaml.safe_load(f) return data.get("fuels", {}) if data else {} - except Exception as e: - pass + except yaml.YAMLError as e: + warnings.warn( + f"Failed to parse fuel metadata from {metadata_file}: {e}", + stacklevel=2 + ) + except OSError as e: + warnings.warn( + f"Failed to read fuel metadata from {metadata_file}: {e}", + stacklevel=2 + ) return {} @@ -62,7 +72,8 @@ def list_fuels_main(): "--fuel_data_dir", default=None, metavar="PATH", - help="Directory where fuel data files are located (e.g., customFuels/fuelData). If not specified, uses embedded FuelLib data.", + help="Directory containing fuel data (with gcData/, groupDecompositionData/, and fuel_metadata.yaml). " + "If not specified, uses embedded FuelLib data.", ) parser.add_argument( "-v", diff --git a/fuellib/convert.py b/fuellib/convert.py index a29133b..a8a4c3e 100644 --- a/fuellib/convert.py +++ b/fuellib/convert.py @@ -1,6 +1,5 @@ """Unit conversion functions.""" -import numpy as np from .constants import k_B, N_A diff --git a/pyproject.toml b/pyproject.toml index 89303b0..9c0be71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,6 +73,7 @@ packages = ["fuellib", "fuellib.exporters", "fuellib.cli"] [tool.setuptools.package-data] fuellib = [ "data/**/*.csv", + "data/**/*.yaml", ] [tool.black] diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index bdadbb8..1a55638 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -72,6 +72,7 @@ def test_source_function_documentation(self): # Check main module, public API modules, exporter scripts, and CLI entry points py_files = [ fuellib_dir / "__init__.py", + fuellib_dir / "_data_locator.py", fuellib_dir / "fuel.py", fuellib_dir / "convert.py", fuellib_dir / "utility.py", From 16c1763c1b8c506388f7ffbdab93460c7617f0e0 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 09:08:35 -0600 Subject: [PATCH 39/48] Consolidate redundant POSF decomposition files - Rename posf10264.csv to posf-cat-a.csv (Conventional ATM Surrogate) - Delete duplicate files: posf4658.csv, posf10289.csv, posf10325.csv (verified identical via checksum: 4026242a7a35eba58a47f3e9a38a025e) - Update fuel_metadata.yaml to point all four conventional POSF fuels to the consolidated posf-cat-a decomposition file - Reduces groupDecompositionData/ from 14 to 11 files - All fuels remain discoverable via CLI and API - Verified: test_api.py passes, fl-fuels lists all 13 fuels correctly, all five POSF fuels (posf4658, posf10264, posf10289, posf10325, posf11498) instantiate successfully - posf11498 (ATJ, isoparaffinic) remains separate as unique composition This change improves maintainability by eliminating file duplication while preserving distinct fuel metadata (names, sources, descriptions) through the fuel_metadata.yaml mapping. --- fuellib/data/fuelData/fuel_metadata.yaml | 8 +-- .../{posf10264.csv => posf-cat-a.csv} | 0 .../groupDecompositionData/posf10289.csv | 68 ------------------- .../groupDecompositionData/posf10325.csv | 68 ------------------- .../groupDecompositionData/posf4658.csv | 68 ------------------- pyproject.toml | 2 +- 6 files changed, 5 insertions(+), 209 deletions(-) rename fuellib/data/fuelData/groupDecompositionData/{posf10264.csv => posf-cat-a.csv} (100%) delete mode 100644 fuellib/data/fuelData/groupDecompositionData/posf10289.csv delete mode 100644 fuellib/data/fuelData/groupDecompositionData/posf10325.csv delete mode 100644 fuellib/data/fuelData/groupDecompositionData/posf4658.csv diff --git a/fuellib/data/fuelData/fuel_metadata.yaml b/fuellib/data/fuelData/fuel_metadata.yaml index 0eed452..33c5453 100644 --- a/fuellib/data/fuelData/fuel_metadata.yaml +++ b/fuellib/data/fuelData/fuel_metadata.yaml @@ -9,7 +9,7 @@ fuels: source: Edwards et al. (2017) reference: https://doi.org/10.2514/6.2017-0146 description: 2004 physical average jet fuel constructed by blending 5 separate jet fuels from across the U.S. - decomp_name: posf4658 + decomp_name: posf-cat-a posf10264: name: A-1 POSF10264 JP-8 @@ -17,7 +17,7 @@ fuels: source: Edwards et al. (2020) reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf description: Best case fuel from NJFCP. Low viscosity, low density, and a low flash point. - decomp_name: posf10264 + decomp_name: posf-cat-a posf10289: name: A-3 POSF10289 JP-5 @@ -25,7 +25,7 @@ fuels: source: Edwards et al. (2020) reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf description: Worst case fuel from NJFCP. High viscosity, high density, and a high flash point. - decomp_name: posf10289 + decomp_name: posf-cat-a posf10325: name: A-2 POSF10325 Jet A @@ -33,7 +33,7 @@ fuels: source: Edwards et al. (2020) reference: https://apps.dtic.mil/sti/pdfs/AD1093317.pdf description: Baseline fuel from NJFCP. Average density, average viscosity, and average flash point. - decomp_name: posf10325 + decomp_name: posf-cat-a posf11498: name: C-1 POSF11498 ATJ diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10264.csv b/fuellib/data/fuelData/groupDecompositionData/posf-cat-a.csv similarity index 100% rename from fuellib/data/fuelData/groupDecompositionData/posf10264.csv rename to fuellib/data/fuelData/groupDecompositionData/posf-cat-a.csv diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10289.csv b/fuellib/data/fuelData/groupDecompositionData/posf10289.csv deleted file mode 100644 index e513610..0000000 --- a/fuellib/data/fuelData/groupDecompositionData/posf10289.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf10325.csv b/fuellib/data/fuelData/groupDecompositionData/posf10325.csv deleted file mode 100644 index e513610..0000000 --- a/fuellib/data/fuelData/groupDecompositionData/posf10325.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/fuellib/data/fuelData/groupDecompositionData/posf4658.csv b/fuellib/data/fuelData/groupDecompositionData/posf4658.csv deleted file mode 100644 index e513610..0000000 --- a/fuellib/data/fuelData/groupDecompositionData/posf4658.csv +++ /dev/null @@ -1,68 +0,0 @@ -Compound,CH3,CH2,CH,C,CH2=CH,CH=CH,CH2=C,CH=C,C=C,CH2=C=CH,ACH,AC,ACCH3,ACCH2,ACCH,OH,ACOH,CH3CO,CH2CO,CHO,CH3COO,CH2COO,HCOO,CH3O,CH2O,CH-O,FCH2O,CH2NH2,CHNH2,CH3NH,CH2NH,CHNH,CH3N,CH2N,ACNH2,C5H4N,C5H3N,CH2CN,COOH,CH2CL,CHCL,CCL,CHCL2,CCL2,CCL3,ACCL,CH2NO2,CHNO2,ACNO2,CH2SH,I,Br,CH≡C,C≡C,CL—(C=C),ACF,HCON(CH2)2,CF3,CF2,CF,COO,CCL2F,HCCLF,CCLF2,Fspecial,CONH2,CONHCH3,CONHCH2,CON(CH3)2,CONCH3CH2,CON(CH2)2,C2H5O2,C2H4O2,CH3S,CH2S,CHS,C4H3S,C4H2S,(CH3)2CH,(CH3)3C,CH(CH3)CH(CH3),CH(CH3)C(CH3)2,C(CH3)2C(CH3)2,3 membered ring,4 membered ring,5 membered ring,6 membered ring,7 membered ring,"CHn=CHm—CHp=CHk k,n,m,p in (0,2)","CH3-CHm=CH, m in (0,1), n in (0,2)","CH2-CHm=CHn, m, n in (0,2)","CH-CHm=CHn or C-CHm=CHn, m,n m in (0,2)",Alicyclic side-chain CcyclicCm m > 1,CH3CH3,CHCHO or CCHO,CH3COCH2,CH3COCH or CH3COC,Ccyclic(=0),ACCHO,CHCOOH or CCOOH,ACCOOH,CH3COOCH or CH3COOC,COCH2COO or COCHCOO or COCCOO, CO-O-CO,ACCOO,CHOH,COH,"CHm(OH)CHn(OH), m,n in (0,2)","CHm cyclic-OH, m in (0,1)","CHm(OH)CHn(NHp), m,n,p in (0,3)",CHm(NH2)CHn(NH2),"CHm cyclic-NHp-CHn cyclic, m,n,p in (0,2)","Chm=Chn-F, m,n in (0,2)",AC-O-CHm,"CHm cyclic-S-CHn cyclic, m,n in (0,2)","CHm=CHn—F, m,n in (0,2)","CHm=CHn—Br, m,n in (0,2)","CHm=CHn—I, m,n in (0,2)",ACBr,ACI,"CHm(NH2)-COOH, m,n in (0,2)" -Toluene,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C2-Benzene,1,0,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C3-Benzene,1,1,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C4-Benzene,1,2,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C5-Benzene,1,3,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C6-Benzene,1,4,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C7-Benzene,1,5,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C8-Benzene,1,6,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C9-Benzene,1,7,0,0,0,0,0,0,0,0,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C10,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C11,0,0,0,0,0,0,0,0,0,0,7,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C12,1,0,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Diaromatic-C13,1,1,0,0,0,0,0,0,0,0,7,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C09,0,1,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C10,0,2,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C11,1,1,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C12,1,2,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C13,1,3,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -Cycloaromatic-C14,1,4,1,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Isoparaffin,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Isoparaffin,3,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Isoparaffin,3,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Isoparaffin,3,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Isoparaffin,3,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Isoparaffin,3,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Isoparaffin,3,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Isoparaffin,3,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Isoparaffin,3,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Isoparaffin,3,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Isoparaffin,3,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C18-Isoparaffin,3,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C19-Isoparaffin,3,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C20-Isoparaffin,3,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C07,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C08,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C09,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C10,2,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C11,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C12,2,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C13,2,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C14,2,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C15,2,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C16,2,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C17,2,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -n-C18,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C07-Monocycloparaffin,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Monocycloparaffin,1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Monocycloparaffin,1,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Monocycloparaffin,1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Monocycloparaffin,1,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Monocycloparaffin,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Monocycloparaffin,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Monocycloparaffin,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Monocycloparaffin,1,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C16-Monocycloparaffin,1,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C17-Monocycloparaffin,1,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C08-Dicycloparaffin,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C09-Dicycloparaffin,0,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Dicycloparaffin,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Dicycloparaffin,1,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Dicycloparaffin,1,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C13-Dicycloparaffin,1,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C14-Dicycloparaffin,1,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C15-Dicycloparaffin,1,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C10-Tricycloparaffin,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C11-Tricycloparaffin,0,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -C12-Tricycloparaffin,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9c0be71..40f9293 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "3.0.0a1" +version = "3.0.0a2" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} From a9855e8cdcd0526fbcdc9251984785bacfee6e89 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 09:15:07 -0600 Subject: [PATCH 40/48] Fix plotting CLI imports - use direct imports instead of re-exports - Remove unnecessary re-exports of C2K, K2C, get_props_data_from_metadata from main fuellib module (kept API clean) - Update plotting.py to directly import: - C2K, K2C from fuellib.convert - get_props_data_from_metadata from fuellib._data_locator - Replace all fl.* calls with direct function names - This is cleaner than polluting the main API with internal CLI utilities - Fixes: fl-plt-props -f posf10325 now works correctly --- CHANGES.md | 53 +++++++++++++++++++++++++++++++++++++++++ customFuels | 1 + fuellib/cli/plotting.py | 12 ++++++---- tutorials/customFuel.py | 36 ++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 CHANGES.md create mode 160000 customFuels create mode 100644 tutorials/customFuel.py diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..a281472 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,53 @@ +This PR makes several improvements to the FuelLib project's installation, documentation, and CI workflows. The main changes include updating installation instructions and documentation to reflect new CLI tools and development workflows, switching CI and documentation builds to use editable/development installs, and modernizing the command-line exporter interface. Additionally, a new publishing guide has been added, and Sphinx documentation references and paths have been updated for consistency. + +## Major Changes + +### Module Organization & Architecture +- **Split monolithic `FuelLib.py` into modules:** + - `constants.py` - Physical constants (k_B, N_A) + - `convert.py` - Temperature and unit conversions + - `utility.py` - Mixture properties and droplet calculations + - `fuel.py` - Main Fuel class for GCM calculations +- **Reorganized repository structure for proper Python packaging:** + - Renamed `source` -> `fuellib` and added a `pyproject.toml` for distribution via pip and conda with proper entry point configuration + - Created `fuellib/cli/` subpackage containing all command-line tools + - Improved package discovery and installation with `pip install -e .`, `pip install -e '.[dev]'`, and `pip install fuellib` + - Reworked the antiquated paths structure for managing paths between data and scripts. Users only need to `import fuellib as fl` provided a `pip install`. + +### CLI Tools Expansion & Organization +**New CLI Commands:** +- `fl-C2K`, `fl-K2C` - Celsius/Kelvin conversion utilities +- `fl-C2F`, `fl-F2C`, `fl-F2K`, `fl-K2F` - Additional temperature conversions +- `fl-eps2K` - Lennard-Jones epsilon to characteristic temperature conversion +- `fl-export-converge` - Export mixture properties for Converge CFD simulations +- `fl-export-pele` - Export properties for PelePhysics simulations +- `fl-plt-comp` - Composition plotting +- `fl-plt-props` - Properties plotting +- `fl-fuels` - List available fuels with metadata support + +### Testing Improvements +- **New `test_exporters.py`:** Comprehensive integration tests for export commands (7 tests) +- **Updated `test_source_docstrings.py`:** Now validates docstrings for all public API modules +- `test_utilities.py` - Unit tests for utility functions and CLI temperature conversion commands +- `test_hc_identification.py` - Unit tests for hydrocarbon classification logic +- Simplified CI exporter job from 8 individual steps to single `test_exporters.py` call +- Total test suite: 40 tests, all passing + +### Documentation & Bug Fixes +- Fixed CSV file path in `fuelprops.rst`: `../../fuelData/` → `../fuellib/data/fuelData/` +- Updated `sourcecode.rst` to reflect new file organization +- Added Sphinx docstring comments to `constants.py` and `fuel.py` attributes +- Fixed GitHub Actions failures related to decomposition metadata +- Fixed error handling for Jet A and cycloaromatic compounds + +### CI/CD Modernization +- Switched to editable/development installs (`pip install -e .` and `pip install -e '.[dev]'`) +- Updated GitHub Actions workflows to use new installation methods + +## Breaking Changes (v3.0.0) + +Functions moved from `fuellib` namespace to submodules: + +- **Temperature conversions:** `fl.C2K()` → `fl.convert.C2K()` +- **Utility functions:** `fl.mixing_rule()` → `fl.utility.mixing_rule()` +- **Constants:** `fl.k_B` still works, but `fl.constants.k_B` recommended \ No newline at end of file diff --git a/customFuels b/customFuels new file mode 160000 index 0000000..00a19ae --- /dev/null +++ b/customFuels @@ -0,0 +1 @@ +Subproject commit 00a19ae44d8a706b4fe5a4e5dec9ba6e3b8af30a diff --git a/fuellib/cli/plotting.py b/fuellib/cli/plotting.py index 0ddd43d..a2ff106 100644 --- a/fuellib/cli/plotting.py +++ b/fuellib/cli/plotting.py @@ -13,6 +13,8 @@ import matplotlib.pyplot as plt import argparse import fuellib as fl +from fuellib.convert import C2K, K2C +from fuellib._data_locator import get_props_data_from_metadata def plot_composition( @@ -403,7 +405,7 @@ def get_predictions_and_data(fuel_name, prop_name): if props_dir and os.path.exists(props_dir): # Check if metadata specifies a different props_data filename - props_data_name = fl.get_props_data_from_metadata(fuel_name, fuel_data_dir) + props_data_name = get_props_data_from_metadata(fuel_name, fuel_data_dir) data_filename = props_data_name if props_data_name else fuel_name data_file = os.path.join(props_dir, f"{data_filename}.csv") @@ -421,11 +423,11 @@ def get_predictions_and_data(fuel_name, prop_name): # First check if experimental data exists - use its range if available if len(T_data) > 0: # Use data range if available - T_pred = fl.C2K(np.linspace(T_data.min(), T_data.max(), 100)) + T_pred = C2K(np.linspace(T_data.min(), T_data.max(), 100)) else: # Use property-specific default range temp_min, temp_max = get_temp_range(prop_name) - T_pred = fl.C2K(np.linspace(temp_min, temp_max, 100)) + T_pred = C2K(np.linspace(temp_min, temp_max, 100)) pred = np.zeros_like(T_pred) Y_li = fuel.Y_0 @@ -472,7 +474,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot predictions ax[i].plot( - fl.K2C(T_pred), + K2C(T_pred), pred, "-", color=line_color, @@ -483,7 +485,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot experimental data if available if len(prop_data) > 0: # Get props_data name for the legend - props_data_name = fl.get_props_data_from_metadata( + props_data_name = get_props_data_from_metadata( fuel_name, fuel_data_dir ) data_label = props_data_name if props_data_name else fuel_name diff --git a/tutorials/customFuel.py b/tutorials/customFuel.py new file mode 100644 index 0000000..5d09a6e --- /dev/null +++ b/tutorials/customFuel.py @@ -0,0 +1,36 @@ +import fuellib as fl + +# Load an embedded fuel +fuel = fl.fuel("posf10264") + +print(f"Fuel: {fuel.name}") +print(f"Fuel data directory: {fuel.fuelDataDir}") +print(f"GC data directory: {fuel.fuelDataGcDir}") +print(f"Decomposition directory: {fuel.fuelDataDecompDir}") +print(f"Properties directory: {fuel.fuelDataPropsDir}") +print(f"Number of compounds: {fuel.num_compounds}") + +# To use a custom fuel, create a directory structure like: +# customFuels/fuelData/ +# ├── gcData/ +# │ └── myFuel_init.csv +# ├── groupDecompositionData/ +# │ └── myFuel.csv +# └── propertiesData/ (optional) +# └── myFuel.csv +# +# Then load it with: +custom_fuel = fl.fuel("hefa-S1", fuelDataDir="customFuels/fuelData") + +# After loading, the fuel object has the correct directory paths: +custom_fuel.fuelDataDir +custom_fuel.fuelDataGcDir +custom_fuel.fuelDataDecompDir +custom_fuel.fuelDataPropsDir + +print(f"\nFuel: {custom_fuel.name}") +print(f"Fuel data directory: {custom_fuel.fuelDataDir}") +print(f"GC data directory: {custom_fuel.fuelDataGcDir}") +print(f"Decomposition directory: {custom_fuel.fuelDataDecompDir}") +print(f"Properties directory: {custom_fuel.fuelDataPropsDir}") +print(f"Number of compounds: {custom_fuel.num_compounds}") From 6a6742e1aecdfe358f10d6ab1c6fed5681063630 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 09:17:46 -0600 Subject: [PATCH 41/48] Rename to get_fueldata_propsdata - consistent API naming - Follows pattern of other data locator functions: get_fueldata_dir, get_fueldata_gc_dir, get_fueldata_decomp_dir, get_fueldata_props_dir, get_gcmtable_dir - get_fueldata_propsdata returns properties data name from fuel_metadata - Updated across _data_locator.py, __init__.py, and plotting.py --- fuellib/__init__.py | 7 +++++++ fuellib/_data_locator.py | 2 +- fuellib/cli/plotting.py | 12 +++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 2354dab..777337d 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -27,8 +27,12 @@ get_fueldata_decomp_dir, get_fueldata_props_dir, get_gcmtable_dir, + get_fueldata_propsdata, ) +# Import conversion functions for convenience +from .convert import C2K, K2C + # Import submodules for namespacing from . import constants from . import convert @@ -43,6 +47,9 @@ "get_fueldata_decomp_dir", "get_fueldata_props_dir", "get_gcmtable_dir", + "get_fueldata_propsdata", + "C2K", + "K2C", "constants", "convert", "utility", diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index 865248a..a3dcb11 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -207,7 +207,7 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): return fuel_meta["decomp_name"] -def get_props_data_from_metadata(fuel_name, fuel_data_dir=None): +def get_fueldata_propsdata(fuel_name, fuel_data_dir=None): """ Load properties data name mapping from fuel_metadata.yaml. diff --git a/fuellib/cli/plotting.py b/fuellib/cli/plotting.py index a2ff106..43548d0 100644 --- a/fuellib/cli/plotting.py +++ b/fuellib/cli/plotting.py @@ -13,8 +13,6 @@ import matplotlib.pyplot as plt import argparse import fuellib as fl -from fuellib.convert import C2K, K2C -from fuellib._data_locator import get_props_data_from_metadata def plot_composition( @@ -405,7 +403,7 @@ def get_predictions_and_data(fuel_name, prop_name): if props_dir and os.path.exists(props_dir): # Check if metadata specifies a different props_data filename - props_data_name = get_props_data_from_metadata(fuel_name, fuel_data_dir) + props_data_name = fl.get_fueldata_propsdata(fuel_name, fuel_data_dir) data_filename = props_data_name if props_data_name else fuel_name data_file = os.path.join(props_dir, f"{data_filename}.csv") @@ -423,11 +421,11 @@ def get_predictions_and_data(fuel_name, prop_name): # First check if experimental data exists - use its range if available if len(T_data) > 0: # Use data range if available - T_pred = C2K(np.linspace(T_data.min(), T_data.max(), 100)) + T_pred = fl.C2K(np.linspace(T_data.min(), T_data.max(), 100)) else: # Use property-specific default range temp_min, temp_max = get_temp_range(prop_name) - T_pred = C2K(np.linspace(temp_min, temp_max, 100)) + T_pred = fl.C2K(np.linspace(temp_min, temp_max, 100)) pred = np.zeros_like(T_pred) Y_li = fuel.Y_0 @@ -474,7 +472,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot predictions ax[i].plot( - K2C(T_pred), + fl.K2C(T_pred), pred, "-", color=line_color, @@ -485,7 +483,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot experimental data if available if len(prop_data) > 0: # Get props_data name for the legend - props_data_name = get_props_data_from_metadata( + props_data_name = fl.get_fueldata_propsdata( fuel_name, fuel_data_dir ) data_label = props_data_name if props_data_name else fuel_name From 6719200e4784a327f2784533dcbaff920942b43c Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 09:35:31 -0600 Subject: [PATCH 42/48] Clean up API exports - use consistent module namespacing - Remove k_B and N_A from top-level (access via fl.constants.k_B, fl.constants.N_A) - Use 'from ._data_locator import *' instead of explicit function list - Add __all__ to _data_locator.py to control what gets exported - Cleaner and more consistent with submodule pattern (fl.convert.*, fl.constants.*, fl.utility.*) - Keep only essential items at top level: fuel, submodules (constants, convert, utility) --- fuellib/__init__.py | 22 +++++----------------- fuellib/_data_locator.py | 12 ++++++++++++ fuellib/cli/plotting.py | 6 +++--- fuellib/exporters/converge.py | 9 ++++++++- fuellib/exporters/pele.py | 9 +++++++++ 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 777337d..168d0fa 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -20,18 +20,8 @@ # Import fuel class from .fuel import fuel -# Import data locator functions for convenience -from ._data_locator import ( - get_fueldata_dir, - get_fueldata_gc_dir, - get_fueldata_decomp_dir, - get_fueldata_props_dir, - get_gcmtable_dir, - get_fueldata_propsdata, -) - -# Import conversion functions for convenience -from .convert import C2K, K2C +# Import data locator functions +from ._data_locator import * # Import submodules for namespacing from . import constants @@ -40,16 +30,14 @@ __all__ = [ "fuel", - "k_B", - "N_A", + "get_data_dir", + "get_gcmtable_dir", "get_fueldata_dir", "get_fueldata_gc_dir", "get_fueldata_decomp_dir", "get_fueldata_props_dir", - "get_gcmtable_dir", + "get_decomp_name_from_metadata", "get_fueldata_propsdata", - "C2K", - "K2C", "constants", "convert", "utility", diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index a3dcb11..70b8941 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -21,6 +21,18 @@ HAS_YAML = False +__all__ = [ + "get_data_dir", + "get_gcmtable_dir", + "get_fueldata_dir", + "get_fueldata_gc_dir", + "get_fueldata_decomp_dir", + "get_fueldata_props_dir", + "get_decomp_name_from_metadata", + "get_fueldata_propsdata", +] + + def _validate_fuel_data_dir(fuel_data_dir): """ Validate that a custom fuel data directory has required subdirectories. diff --git a/fuellib/cli/plotting.py b/fuellib/cli/plotting.py index 43548d0..9f00159 100644 --- a/fuellib/cli/plotting.py +++ b/fuellib/cli/plotting.py @@ -421,11 +421,11 @@ def get_predictions_and_data(fuel_name, prop_name): # First check if experimental data exists - use its range if available if len(T_data) > 0: # Use data range if available - T_pred = fl.C2K(np.linspace(T_data.min(), T_data.max(), 100)) + T_pred = fl.convert.C2K(np.linspace(T_data.min(), T_data.max(), 100)) else: # Use property-specific default range temp_min, temp_max = get_temp_range(prop_name) - T_pred = fl.C2K(np.linspace(temp_min, temp_max, 100)) + T_pred = fl.convert.C2K(np.linspace(temp_min, temp_max, 100)) pred = np.zeros_like(T_pred) Y_li = fuel.Y_0 @@ -472,7 +472,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot predictions ax[i].plot( - fl.K2C(T_pred), + fl.convert.K2C(T_pred), pred, "-", color=line_color, diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index dc4d0f6..bbcddd1 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -639,10 +639,17 @@ def main(): print(f" Export directory: {export_dir}") print(f" Fuel data directory: {fuel_data_dir}") + # Get decomposition name from metadata + try: + decomp_name = fl.get_decomp_name_from_metadata(fuel_name, fuel_data_dir) + except (FileNotFoundError, KeyError): + # If metadata lookup fails, fall back to fuel_name + decomp_name = fuel_name + # Check if necessary files exist in the fuelData directory print("\nChecking for required files...") gcxgc_file = os.path.join(fuel_data_dir, f"gcData/{fuel_name}_init.csv") - decomp_file = os.path.join(fuel_data_dir, f"groupDecompositionData/{fuel_name}.csv") + decomp_file = os.path.join(fuel_data_dir, f"groupDecompositionData/{decomp_name}.csv") if not os.path.exists(gcxgc_file): err = f"GCXGC file for {fuel_name} not found in {fuel_data_dir}/gcData. gcxgc_file = {gcxgc_file}" raise FileNotFoundError(err) diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index cf44b23..51bfa35 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -656,6 +656,15 @@ def main(): fuel_name = args.fuel_name fuel_decomp_name = args.fuel_decomp_name fuel_data_dir = args.fuel_data_dir + + # If decomposition name not provided, read from metadata + if fuel_decomp_name is None: + try: + fuel_decomp_name = fl.get_decomp_name_from_metadata(fuel_name, fuel_data_dir) + except (FileNotFoundError, KeyError): + # If metadata lookup fails, fall back to fuel_name + fuel_decomp_name = None + units = args.units.lower() dep_fuel_names = args.dep_fuel_names use_pp_keys = args.use_pp_keys From 185ecb5c8535889c02a9d4030b2ad49f17d46535 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 09:38:48 -0600 Subject: [PATCH 43/48] Remove unused import of k_B and N_A - Not exported in __all__, so import was dead code - Access via fl.constants.k_B, fl.constants.N_A when needed --- fuellib/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 168d0fa..99f2996 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -14,9 +14,6 @@ except Exception: __version__ = "unknown" -# Import constants -from .constants import k_B, N_A - # Import fuel class from .fuel import fuel From 4a3f0ce2b2ab794ac858c6e6f81ffd1daa67865e Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 11:22:48 -0600 Subject: [PATCH 44/48] Simplify API, update docs --- README.md | 12 +++-- docs/development.rst | 1 - docs/index.rst | 23 +++++----- docs/sourcecode.rst | 3 ++ docs/tutorials-basic.rst | 4 +- docs/tutorials-custom-fuels.rst | 15 ++----- fuellib/__init__.py | 4 +- fuellib/_data_locator.py | 8 ++-- fuellib/cli/fuel_manager.py | 10 ++--- fuellib/cli/plotting.py | 79 ++++++++++++--------------------- fuellib/exporters/converge.py | 20 +-------- fuellib/exporters/pele.py | 34 +++----------- fuellib/fuel.py | 4 +- pyproject.toml | 4 +- tests/test_api.py | 15 +++++-- tests/test_exporters.py | 56 +++++++++++++++++++++++ tests/test_utilities.py | 4 +- 17 files changed, 146 insertions(+), 150 deletions(-) diff --git a/README.md b/README.md index 84e9df7..258acd5 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,11 @@ The easiest way to install FuelLib is via pip: pip install fuellib ``` -This will make the command-line exporters (`fl-export-pele` and `fl-export-converge`) available. +This will make the command-line tools available, including: +- `fl-export-pele` and `fl-export-converge` for exporting fuel properties +- `fl-plt-props` and `fl-plt-comp` for plotting fuel composition and properties +- `fl-fuels` for listing available fuels +- Temperature and unit conversion utilities ### Option 2: Development Installation (For Contributors) @@ -39,12 +43,12 @@ pip install -e '.[dev]' # Install with development tools (docs, testing, format See the [Contributing](https://NatLabRockies.github.io/FuelLib/development.html) page for more detailed setup instructions and contribution guidelines. -### Optional: Create a Conda Environment +### Optional: Use a Dedicated Conda Environment -To use a specific conda environment: +For better dependency isolation, you can create a conda environment first: ```bash -conda create --name fuellib-env python numpy pandas scipy matplotlib +conda create --name fuellib-env python conda activate fuellib-env pip install fuellib ``` diff --git a/docs/development.rst b/docs/development.rst index a20bd9d..016541c 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -19,7 +19,6 @@ This installs FuelLib with all development tools: - **Documentation:** Sphinx, sphinx-rtd-theme, sphinxcontrib-bibtex - **Code formatting:** Black - **Testing:** pytest -- **Plotting:** matplotlib Optional: Conda Environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/index.rst b/docs/index.rst index fc402bc..9b3a2bb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -19,16 +19,15 @@ Citing this work If you use FuelLib in your research, please cite the following software record: -.. code-block:: none +Montgomery, David, Appukuttan, Sreejith, Yellapantula, Shashank, Perry, Bruce, and Binswanger, Adam. FuelLib (Fuel Library) [SWR-25-26]. Computer Software. https://github.com/NatLabRockies/FuelLib. USDOE Office of Energy Efficiency and Renewable Energy (EERE), Office of Sustainable Transportation. Vehicle Technologies Office (VTO). 27 Feb. 2025. Web. `doi:10.11578/dc.20250317.1 `_. - Montgomery, David, Appukuttan, Sreejith, Yellapantula, Shashank, Perry, Bruce, and Binswanger, Adam. FuelLib (Fuel Library) [SWR-25-26]. Computer Software. https://github.com/NatLabRockies/FuelLib. USDOE Office of Energy Efficiency and Renewable Energy (EERE), Office of Sustainable Transportation. Vehicle Technologies Office (VTO). 27 Feb. 2025. Web. doi:10.11578/dc.20250317.1. +Or in BibTeX format: .. code-block:: bibtex - @misc{montgomery_fuellib_2025, + @misc{fuellib_2025, title = {FuelLib (Fuel Library) [SWR-25-26]}, author = {Montgomery, David and Appukuttan, Sreejith and Yellapantula, Shashank and Perry, Bruce and Binswanger, Adam}, - abstractNote = {FuelLib is a library that utilizes the group contribution method (GCM) for calculating thermodynamic properties of hydro-carbon jet fuels. FuelLib utilizes the tables and functions of the GCM as proposed by Constantinou and Gani (1994) and Constantinou, Gani and O'Connel (1995), with additional physical properties discussed in Govindaraju & Ihme (2016). The code is based on Pavan B. Govindaraju's Matlab implementation of the GCM, and has been expanded to include additional thermodynamic properties and mixture properties. The fuel library contains gas chromatography (GC x GC) data for a variety of fuels ranging from simple single component fuels to complex jet fuels. The GC x GC data for POSF jet fuels comes from Edwards (2020).}, doi = {10.11578/dc.20250317.1}, url = {https://doi.org/10.11578/dc.20250317.1}, howpublished = {[Computer Software] \url{https://doi.org/10.11578/dc.20250317.1}}, @@ -45,22 +44,20 @@ The easiest way to install FuelLib is via pip: pip install fuellib -After installation, the command-line exporters for exporting fuel data will be available: +After installation, several command command-line tools will be available for exporting fuel data and plotting fuel properties. See the `CLI Tutorials `_ for detailed usage examples and options. -.. code-block:: bash - - fl-export-pele -h # Export for PelePhysics simulations - fl-export-converge -h # Export for Converge simulations - -For more detailed information or development setup, see the `Contributing `_ page. +For more detailed information on a development setup, see the `Contributing `_ page. **Package Requirements** FuelLib requires: -- numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0 +- numpy ≥1.19.0 +- pandas ≥1.0.0 +- scipy ≥1.5.0 +- matplotlib ≥3.0.0 -Development tools (Sphinx, Black, pytest, matplotlib) are available for developers installing from source; see the installation instructions in the tutorials section. +Development tools (Sphinx, Black, pytest) are available for developers installing from source; see the installation instructions in the `Contributing `_ section. .. toctree:: :maxdepth: 4 diff --git a/docs/sourcecode.rst b/docs/sourcecode.rst index ba2134c..84fc942 100644 --- a/docs/sourcecode.rst +++ b/docs/sourcecode.rst @@ -17,12 +17,15 @@ FuelLib File Organization - ``convert.py``: temperature conversion functions and Lennard-Jones calculations - ``utility.py``: utility functions for mixture properties and droplet calculations - ``_data_locator.py``: internal module for locating and validating fuel data directories + - **data**: directory containing fuel data and metadata + - **fuelData:** - **gcData:** directory containing a collection of GCxGC compositional data by weight percentages - **groupDecompositionData:** directory containing a collection of functional group decompositions - **propertiesData:** directory containing measurement or predicted data used for validation - ``fuel_metadata.yaml``: YAML file that maps fuel names to their decomposition files and optional metadata fields + - **exporters:** subpackage with CLI exporters for generating fuel properties - ``converge.py``: exporter for Converge CFD simulations (CLI: ``fl-export-converge``) diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index e06ca96..eac461f 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -14,9 +14,9 @@ Install FuelLib using pip: pip install fuellib -The required dependencies (numpy ≥1.19.0, pandas ≥1.0.0, scipy ≥1.5.0) will be installed automatically. +The required dependencies will be installed automatically. -For information about contributing or development setup, see the `Contributing `_ page. +For information about contributing or installation for development, see the `Contributing `_ page. If you want to run the example scripts, you can either clone the repository or download individual tutorial files from the `tutorials `_ directory on GitHub. diff --git a/docs/tutorials-custom-fuels.rst b/docs/tutorials-custom-fuels.rst index 19f218b..5988732 100644 --- a/docs/tutorials-custom-fuels.rst +++ b/docs/tutorials-custom-fuels.rst @@ -22,16 +22,15 @@ Create a fuel data directory with this structure: - ``gcData/``: Contains GC×GC composition data (one file per fuel) - ``groupDecompositionData/``: Contains functional group decomposition data (one file per fuel) -**Required file:** +**Required metadata:** - ``fuel_metadata.yaml``: Configuration file that maps fuel names to their decomposition files Metadata Configuration ---------------------- -Each custom fuel directory must have a ``fuel_metadata.yaml`` file at the root of the ``fuelData`` directory. This file defines the mapping from fuel names to their group decomposition files. - -**Minimal format:** +Each custom fuel directory must have a ``fuel_metadata.yaml`` file at the root of the directory. This file defines the mapping from fuel names to their group decomposition files. +At a minimum, each fuel entry must include the ``decomp_name`` field that specifies the name of the decomposition file (without the ``.csv`` extension) in the ``groupDecompositionData/`` directory as shown below. .. code-block:: yaml @@ -39,13 +38,7 @@ Each custom fuel directory must have a ``fuel_metadata.yaml`` file at the root o your_fuel: decomp_name: your_fuel -**Fields:** - -- ``decomp_name`` (required): Name of the decomposition CSV file (without ``.csv`` extension). Must match a file in ``groupDecompositionData/`` - -**Optional fields:** - -You can add additional metadata for documentation: +Additional metadata can be included for documentation purposes, but is not required for FuelLib to function. The following fields are available for each fuel: .. code-block:: yaml diff --git a/fuellib/__init__.py b/fuellib/__init__.py index 99f2996..93d8f3d 100644 --- a/fuellib/__init__.py +++ b/fuellib/__init__.py @@ -33,8 +33,8 @@ "get_fueldata_gc_dir", "get_fueldata_decomp_dir", "get_fueldata_props_dir", - "get_decomp_name_from_metadata", - "get_fueldata_propsdata", + "get_metadata_decomp_name", + "get_metadata_props_data", "constants", "convert", "utility", diff --git a/fuellib/_data_locator.py b/fuellib/_data_locator.py index 70b8941..c514cd7 100644 --- a/fuellib/_data_locator.py +++ b/fuellib/_data_locator.py @@ -28,8 +28,8 @@ "get_fueldata_gc_dir", "get_fueldata_decomp_dir", "get_fueldata_props_dir", - "get_decomp_name_from_metadata", - "get_fueldata_propsdata", + "get_metadata_decomp_name", + "get_metadata_props_data", ] @@ -137,7 +137,7 @@ def get_fueldata_props_dir(): return _get_props_dir_for_fueldata(get_fueldata_dir()) -def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): +def get_metadata_decomp_name(fuel_name, fuel_data_dir=None): """ Load decomposition name mapping from fuel_metadata.yaml. @@ -219,7 +219,7 @@ def get_decomp_name_from_metadata(fuel_name, fuel_data_dir=None): return fuel_meta["decomp_name"] -def get_fueldata_propsdata(fuel_name, fuel_data_dir=None): +def get_metadata_props_data(fuel_name, fuel_data_dir=None): """ Load properties data name mapping from fuel_metadata.yaml. diff --git a/fuellib/cli/fuel_manager.py b/fuellib/cli/fuel_manager.py index 7e3095b..bc18933 100644 --- a/fuellib/cli/fuel_manager.py +++ b/fuellib/cli/fuel_manager.py @@ -22,7 +22,7 @@ def load_fuel_metadata(fuel_data_dir=None): """ Load fuel metadata from YAML file if available. - :param fuel_data_dir: Optional directory containing fuel data (parent of gcData/, + :param fuel_data_dir: Optional directory containing fuel data (parent of gcData/, groupDecompositionData/, and fuel_metadata.yaml). If None, loads from embedded FuelLib data. :type fuel_data_dir: str, optional @@ -47,13 +47,11 @@ def load_fuel_metadata(fuel_data_dir=None): return data.get("fuels", {}) if data else {} except yaml.YAMLError as e: warnings.warn( - f"Failed to parse fuel metadata from {metadata_file}: {e}", - stacklevel=2 + f"Failed to parse fuel metadata from {metadata_file}: {e}", stacklevel=2 ) except OSError as e: warnings.warn( - f"Failed to read fuel metadata from {metadata_file}: {e}", - stacklevel=2 + f"Failed to read fuel metadata from {metadata_file}: {e}", stacklevel=2 ) return {} @@ -73,7 +71,7 @@ def list_fuels_main(): default=None, metavar="PATH", help="Directory containing fuel data (with gcData/, groupDecompositionData/, and fuel_metadata.yaml). " - "If not specified, uses embedded FuelLib data.", + "If not specified, uses embedded FuelLib data.", ) parser.add_argument( "-v", diff --git a/fuellib/cli/plotting.py b/fuellib/cli/plotting.py index 9f00159..8f3cb93 100644 --- a/fuellib/cli/plotting.py +++ b/fuellib/cli/plotting.py @@ -61,39 +61,20 @@ def plot_composition( # Load the fuel fuel = fl.fuel(fuel_name, decompName=decomp_name, fuelDataDir=fuel_data_dir) - # Create DataFrame with compound data - family_names = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic"] + # Create DataFrame with compound data and carbon numbers from fuel object df = pd.DataFrame( { "Compound": fuel.compounds, "Weight %": fuel.Y_0 * 100, "Family": fuel.hc_type, + "nC": fuel.nC, } ) - # Determine carbon number from compound name - def determine_carbon_number(compound): - """Extract carbon number from compound name.""" - if "Toluene" in compound: - return 7 - elif "benzene" in compound.lower(): - match = re.search(r"C(\d+)", compound) - if match: - try: - return int(match.group(1)) + 6 - except ValueError: - return np.nan - return np.nan - else: - match = re.search(r"C(\d+)", compound) - if match: - try: - return int(match.group(1)) - except ValueError: - return np.nan - return np.nan - - df["nC"] = df["Compound"].apply(determine_carbon_number) + # Get unique families from the fuel data in canonical order + canonical_order = ["n-alkane", "iso-alkane", "cyclo-alkane", "aromatic", "alkene"] + unique_families = list(np.unique(fuel.hc_type)) + family_names = [f for f in canonical_order if f in unique_families] # Remove rows with weight % <= 0.01 df = df[df["Weight %"] > 0.01] @@ -106,8 +87,10 @@ def determine_carbon_number(compound): print("Relative Weight % of Each Compound Family") print(f"Fuel: {fuel_name}") print("=" * 50) - for family, weight in family_weights.items(): - print(f" {family:<20} {weight:>8.2f}%") + for family in family_names: + if family in family_weights.index: + weight = family_weights[family] + print(f" {family:<20} {weight:>8.2f}%") print("-" * 50) print(f" {'Total':<20} {family_weights.sum():>8.2f}%") print("=" * 50 + "\n") @@ -124,27 +107,23 @@ def determine_carbon_number(compound): # Create figure with two subplots side by side fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), constrained_layout=True) - # Plot 1: Bar chart grouped by carbon number + # Plot 1: Bar chart grouped by carbon number, colored by hydrocarbon type spacing = [-0.2985, -0.099, 0.099, 0.2985] - N = df.nC.unique() - families_in_data = df["Family"].unique() + nC_values = sorted(df["nC"].unique()) - for k, family in enumerate(family_names): - if family not in families_in_data: - continue + # Get unique families that are in the filtered data + families_in_data = [f for f in family_names if f in df["Family"].values] + + # Create bars for each family at each carbon number + for k, family in enumerate(families_in_data): df_family = df[df["Family"] == family] - nC = df_family.nC - weight = df_family["Weight %"] - # Check for duplicate carbon numbers and sum weights - if len(nC) != len(set(nC)): - df_grouped = df_family.groupby("nC")["Weight %"].sum().reset_index() - nC = df_grouped["nC"] - weight = df_grouped["Weight %"] + # Group by carbon number and sum weights + family_by_nC = df_family.groupby("nC")["Weight %"].sum() ax1.bar( - nC + spacing[k], - weight, + family_by_nC.index + spacing[k], + family_by_nC.values, label=family, alpha=1, color=colors.get(family, "#7f7f7f"), @@ -152,15 +131,17 @@ def determine_carbon_number(compound): ) ax1.set_xlabel("Carbon Number", fontsize=16) - ax1.set_xticks(sorted(N)) - ax1.set_xticklabels(sorted(N), fontsize=14) - ax1.set_xlim(min(N) - 0.5, max(N) + 0.5) ax1.set_ylabel("Weight %", fontsize=16) + ax1.set_xticks(nC_values) + ax1.set_xticklabels( + [int(n) if n == int(n) else f"{n:.1f}" for n in nC_values], fontsize=14 + ) + ax1.set_xlim(min(nC_values) - 0.5, max(nC_values) + 0.5) ax1.tick_params(axis="y", labelsize=14) ax1.grid(axis="y", alpha=0.3) # Plot 2: Pie chart of family composition - # Only include families that have weight > 0 + # Only include families that have weight > 0, in canonical order families_present = [ f for f in family_names if f in family_weights.index and family_weights[f] > 0 ] @@ -403,7 +384,7 @@ def get_predictions_and_data(fuel_name, prop_name): if props_dir and os.path.exists(props_dir): # Check if metadata specifies a different props_data filename - props_data_name = fl.get_fueldata_propsdata(fuel_name, fuel_data_dir) + props_data_name = fl.get_metadata_props_data(fuel_name, fuel_data_dir) data_filename = props_data_name if props_data_name else fuel_name data_file = os.path.join(props_dir, f"{data_filename}.csv") @@ -483,9 +464,7 @@ def get_predictions_and_data(fuel_name, prop_name): # Plot experimental data if available if len(prop_data) > 0: # Get props_data name for the legend - props_data_name = fl.get_fueldata_propsdata( - fuel_name, fuel_data_dir - ) + props_data_name = fl.get_metadata_props_data(fuel_name, fuel_data_dir) data_label = props_data_name if props_data_name else fuel_name ax[i].scatter( T_data, diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index bbcddd1..e69d94b 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -639,24 +639,8 @@ def main(): print(f" Export directory: {export_dir}") print(f" Fuel data directory: {fuel_data_dir}") - # Get decomposition name from metadata - try: - decomp_name = fl.get_decomp_name_from_metadata(fuel_name, fuel_data_dir) - except (FileNotFoundError, KeyError): - # If metadata lookup fails, fall back to fuel_name - decomp_name = fuel_name - - # Check if necessary files exist in the fuelData directory - print("\nChecking for required files...") - gcxgc_file = os.path.join(fuel_data_dir, f"gcData/{fuel_name}_init.csv") - decomp_file = os.path.join(fuel_data_dir, f"groupDecompositionData/{decomp_name}.csv") - if not os.path.exists(gcxgc_file): - err = f"GCXGC file for {fuel_name} not found in {fuel_data_dir}/gcData. gcxgc_file = {gcxgc_file}" - raise FileNotFoundError(err) - if not os.path.exists(decomp_file): - err = f"Decomposition file for {fuel_name} not found in {fuel_data_dir}/groupDecompositionData. decomp_file = {decomp_file}" - raise FileNotFoundError(err) - print("All required files found.") + # Get decomposition name from metadata (required) + decomp_name = fl.get_metadata_decomp_name(fuel_name, fuel_data_dir) # Create the fuel object fuel = fl.fuel(fuel_name, fuelDataDir=fuel_data_dir) diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index 51bfa35..c4e63d2 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -656,15 +656,11 @@ def main(): fuel_name = args.fuel_name fuel_decomp_name = args.fuel_decomp_name fuel_data_dir = args.fuel_data_dir - - # If decomposition name not provided, read from metadata + + # If decomposition name not provided, read from metadata (required) if fuel_decomp_name is None: - try: - fuel_decomp_name = fl.get_decomp_name_from_metadata(fuel_name, fuel_data_dir) - except (FileNotFoundError, KeyError): - # If metadata lookup fails, fall back to fuel_name - fuel_decomp_name = None - + fuel_decomp_name = fl.get_metadata_decomp_name(fuel_name, fuel_data_dir) + units = args.units.lower() dep_fuel_names = args.dep_fuel_names use_pp_keys = args.use_pp_keys @@ -677,8 +673,7 @@ def main(): # Print the parsed arguments print(f"Preparing to export properties:") print(f" Fuel name: {fuel_name}") - if fuel_decomp_name is not None: - print(f" Decomposition name: {fuel_decomp_name}") + print(f" Decomposition name: {fuel_decomp_name}") print(f" Units: {units}") print(f" Liquid property model: {liq_prop_model}") if liq_prop_model.lower() == "mp": @@ -687,25 +682,6 @@ def main(): print(f" Export directory: {export_dir}") print(f" Fuel data directory: {fuel_data_dir}") - # Check if necessary files exist in the fuelData directory - print("\nChecking for required files...") - gcxgc_file = os.path.join(fuel_data_dir, f"gcData/{fuel_name}_init.csv") - if fuel_decomp_name is None: - decomp_file = os.path.join( - fuel_data_dir, f"groupDecompositionData/{fuel_name}.csv" - ) - else: - decomp_file = os.path.join( - fuel_data_dir, f"groupDecompositionData/{fuel_decomp_name}.csv" - ) - if not os.path.exists(gcxgc_file): - err = f"GCXGC file for {fuel_name} not found in {fuel_data_dir}/gcData. gxcgc_file = {gcxgc_file}" - raise FileNotFoundError(err) - if not os.path.exists(decomp_file): - err = f"Decomposition file for {fuel_name} not found in {fuel_data_dir}/groupDecompositionData. decomp_file = {decomp_file}" - raise FileNotFoundError(err) - print("All required files found.") - # Create the groupContribution object for the specified fuel fuel = fl.fuel(fuel_name, decompName=fuel_decomp_name, fuelDataDir=fuel_data_dir) diff --git a/fuellib/fuel.py b/fuellib/fuel.py index 7b25ad1..879c20b 100644 --- a/fuellib/fuel.py +++ b/fuellib/fuel.py @@ -14,7 +14,7 @@ get_fueldata_gc_dir, get_fueldata_decomp_dir, get_fueldata_props_dir, - get_decomp_name_from_metadata, + get_metadata_decomp_name, ) @@ -143,7 +143,7 @@ def __init__(self, name, decompName=None, fuelDataDir=None): self.name = name if decompName is None: # Try to get decomposition name from metadata - decompName = get_decomp_name_from_metadata(name, fuelDataDir) + decompName = get_metadata_decomp_name(name, fuelDataDir) # Determine and set data directories for this fuel instance if fuelDataDir is None: diff --git a/pyproject.toml b/pyproject.toml index 40f9293..ce6fe1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "3.0.0a2" +version = "3.0.0a3" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} @@ -32,6 +32,7 @@ dependencies = [ "pandas>=1.0.0", "scipy>=1.5.0", "pyyaml>=5.0", + "matplotlib>=3.0", "importlib-resources>=5.0; python_version < '3.9'", ] @@ -39,7 +40,6 @@ dependencies = [ dev = [ "black>=26.3.1", "pytest>=6.0", - "matplotlib>=3.0", "sphinx>=4.0", "sphinx-rtd-theme>=1.0", "sphinxcontrib-bibtex>=2.0", diff --git a/tests/test_api.py b/tests/test_api.py index ac69a4c..a31bb15 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -49,8 +49,6 @@ def test_fuellib_module_api(self): print("\nFuelLib Module API:") expected_top_level = { "fuel": "class", - "k_B": "constant", - "N_A": "constant", "constants": "module", "convert": "module", "utility": "module", @@ -74,9 +72,18 @@ def test_fuellib_module_api(self): isinstance(getattr(fl, name), types.ModuleType), msg=f"FuelLib.{name} should be a module", ) - print(f" ✓ {name} ({obj_type})") + else: + print(f" ✓ {name} ({obj_type})") - # Check convert submodule + # Check that constants are available via module + self.assertTrue( + hasattr(fl.constants, "k_B"), msg="FuelLib.constants.k_B not found" + ) + self.assertTrue( + hasattr(fl.constants, "N_A"), msg="FuelLib.constants.N_A not found" + ) + print(f" ✓ constants.k_B (constant)") + print(f" ✓ constants.N_A (constant)") print("\nFuelLib.convert Module API:") convert_funcs = { "C2K": "(T)", diff --git a/tests/test_exporters.py b/tests/test_exporters.py index d3bb649..02c3003 100644 --- a/tests/test_exporters.py +++ b/tests/test_exporters.py @@ -5,6 +5,10 @@ import subprocess import sys +import tempfile +import shutil +import os +import fuellib as fl def run_export_command(cmd): @@ -75,6 +79,50 @@ def test_converge_mixture(): ) +def test_pele_custom_fuel_data_dir(): + """Test fl-export-pele with custom fuel data directory (not embedded data).""" + # Create a temporary directory and copy fuelData to it + with tempfile.TemporaryDirectory() as tmpdir: + # Copy the embedded fuelData to a temp location + embedded_fueldata = fl.get_fueldata_dir() + custom_fueldata = os.path.join(tmpdir, "fuelData") + shutil.copytree(embedded_fueldata, custom_fueldata) + + # Export from custom location + run_export_command( + ["fl-export-pele", "-f", "posf10264", "-dir", custom_fueldata] + ) + + +def test_converge_custom_fuel_data_dir(): + """Test fl-export-converge with custom fuel data directory (not embedded data).""" + # Create a temporary directory and copy fuelData to it + with tempfile.TemporaryDirectory() as tmpdir: + # Copy the embedded fuelData to a temp location + embedded_fueldata = fl.get_fueldata_dir() + custom_fueldata = os.path.join(tmpdir, "fuelData") + shutil.copytree(embedded_fueldata, custom_fueldata) + + # Export from custom location + run_export_command( + [ + "fl-export-converge", + "-f", + "posf10264", + "-dir", + custom_fueldata, + "-m", + "true", + "-t", + "280", + "-T", + "400", + "-s", + "10", + ] + ) + + if __name__ == "__main__": print("Running exporter tests...\n") @@ -87,11 +135,19 @@ def test_converge_mixture(): ("fl-export-pele - mixture export with MP model", test_pele_mixture_mp), ("fl-export-pele - mixture export with CGS units", test_pele_mixture_cgs), ("fl-export-pele - single deposit species", test_pele_deposit_species), + ( + "fl-export-pele - custom fuel data directory", + test_pele_custom_fuel_data_dir, + ), ( "fl-export-converge - individual component export", test_converge_individual_component, ), ("fl-export-converge - mixture export", test_converge_mixture), + ( + "fl-export-converge - custom fuel data directory", + test_converge_custom_fuel_data_dir, + ), ] failed = [] diff --git a/tests/test_utilities.py b/tests/test_utilities.py index e4e8360..e64594a 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -16,7 +16,7 @@ def test_epsilon_to_characteristic_temperature(self): # epsilon_molecule = 1000 / 6.02214076e23 J # T* = epsilon_molecule / k_B = (1000 / 6.02214076e23) / 1.380649e-23 K result = fl.convert.epsilon_to_characteristic_temperature(1000.0) - expected = (1000.0 / fl.N_A) / fl.k_B + expected = (1000.0 / fl.constants.N_A) / fl.constants.k_B self.assertAlmostEqual(result, expected, places=10) def test_epsilon_to_characteristic_temperature_zero(self): @@ -27,7 +27,7 @@ def test_epsilon_to_characteristic_temperature_zero(self): def test_epsilon_to_characteristic_temperature_negative(self): """Test epsilon conversion with negative input.""" result = fl.convert.epsilon_to_characteristic_temperature(-1000.0) - expected = (-1000.0 / fl.N_A) / fl.k_B + expected = (-1000.0 / fl.constants.N_A) / fl.constants.k_B self.assertAlmostEqual(result, expected, places=10) def test_C2K(self): From 978a38608b44fdcb1eab8b593c4256252e745afa Mon Sep 17 00:00:00 2001 From: Dave Montgomery Date: Tue, 19 May 2026 12:10:42 -0600 Subject: [PATCH 45/48] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .github/workflows/documentation.yml | 2 +- README.md | 2 +- docs/index.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 97d0a69..33aad6d 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -36,7 +36,7 @@ jobs: - name: Build docs run: | - fl-build-docs -W + sphinx-build -W -b html docs docs/_build/html - name: Upload artifact (for PR preview or later steps) uses: actions/upload-artifact@v4 diff --git a/README.md b/README.md index 258acd5..cb749e4 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Quick start: 1. Fork the main repository 2. Create a `newFeature` branch that contains your changes 3. Update the sphinx documentation in `newFeature` -4. Install development dependencies: `pip install -e '.[dev]` +4. Install development dependencies: `pip install -e '.[dev]'` 5. Format the source code files using the provided CLI command: `fl-format` 6. Run tests and build documentation locally to verify your changes 7. Open a Pull Request (PR) from `newFeature` on your fork to branch `main` FuelLib repository. diff --git a/docs/index.rst b/docs/index.rst index 9b3a2bb..132f040 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -44,7 +44,7 @@ The easiest way to install FuelLib is via pip: pip install fuellib -After installation, several command command-line tools will be available for exporting fuel data and plotting fuel properties. See the `CLI Tutorials `_ for detailed usage examples and options. +After installation, several command-line tools will be available for exporting fuel data and plotting fuel properties. See the `CLI Tutorials `_ for detailed usage examples and options. For more detailed information on a development setup, see the `Contributing `_ page. From bd043cba6c67260a11181fdec928f03cc9b8dad3 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 12:17:16 -0600 Subject: [PATCH 46/48] Resolve comments from review --- docs/tutorials-basic.rst | 2 +- fuellib/cli/format_code.py | 25 +--- fuellib/cli/temp_converter.py | 142 ++++++++++++----------- fuellib/cli/transport_props_converter.py | 25 ++-- tests/test_source_docstrings.py | 10 +- tests/test_utilities.py | 12 +- 6 files changed, 108 insertions(+), 108 deletions(-) diff --git a/docs/tutorials-basic.rst b/docs/tutorials-basic.rst index eac461f..14bb8a0 100644 --- a/docs/tutorials-basic.rst +++ b/docs/tutorials-basic.rst @@ -70,7 +70,7 @@ the remaining branch with a single CH3 group bonded to a CH2 group is not define All group decomposition files must follow the groups defined in `gcmTable`_, there are :math:`N_{g1} = 78` first-order groups and :math:`N_{g2} = 43` second order groups. The second-order groups start with the branching structure `(CH3)2CH`. Not all branching structures are defined in the `gcmTable`_. We recommend - starting with `groupDecompositionData/refCompounds.csv` and adapting the decompositions and compounds for your fuel. + starting with `fuellib/data/fuelData/groupDecompositionData/refCompounds.csv` and adapting the decompositions and compounds for your fuel. Basic Usage ^^^^^^^^^^^ diff --git a/fuellib/cli/format_code.py b/fuellib/cli/format_code.py index 25f958d..60dbdba 100644 --- a/fuellib/cli/format_code.py +++ b/fuellib/cli/format_code.py @@ -17,28 +17,15 @@ def main(): project_root = os.path.dirname(fuellib_dir) try: + # Call Black directly with the project root + # Black will recursively find and format all .py files result = subprocess.run( - ["find", project_root, "-name", "*.py", "-print0"], - capture_output=True, - text=False, + [sys.executable, "-m", "black", project_root], check=True, ) - - # Use xargs to pass files to black - process = subprocess.Popen( - ["xargs", "-0", "black"], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = process.communicate(input=result.stdout) - - if stdout: - print(stdout.decode()) - if stderr: - print(stderr.decode(), file=sys.stderr) - - sys.exit(process.returncode) + sys.exit(result.returncode) + except subprocess.CalledProcessError as e: + sys.exit(e.returncode) except Exception as e: print(f"Error running black formatter: {e}", file=sys.stderr) sys.exit(1) diff --git a/fuellib/cli/temp_converter.py b/fuellib/cli/temp_converter.py index f434e3c..c56e958 100644 --- a/fuellib/cli/temp_converter.py +++ b/fuellib/cli/temp_converter.py @@ -1,100 +1,106 @@ """Command-line tools to convert temperatures.""" -import sys +import argparse from .. import convert def c2k_main(): """Convert temperature from Celsius to Kelvin via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-C2K ") - print("\nConvert temperature from Celsius to Kelvin") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Celsius to Kelvin" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Celsius", + ) - try: - temp_c = float(sys.argv[1]) - result = convert.C2K(temp_c) - print(f"{temp_c} °C = {result:.2f} K") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.C2K(args.temperature) + print(f"{args.temperature} °C = {result:.2f} K") def k2c_main(): """Convert temperature from Kelvin to Celsius via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-K2C ") - print("\nConvert temperature from Kelvin to Celsius") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Kelvin to Celsius" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Kelvin", + ) - try: - temp_k = float(sys.argv[1]) - result = convert.K2C(temp_k) - print(f"{temp_k} K = {result:.2f} °C") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.K2C(args.temperature) + print(f"{args.temperature} K = {result:.2f} °C") def c2f_main(): """Convert temperature from Celsius to Fahrenheit via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-C2F ") - print("\nConvert temperature from Celsius to Fahrenheit") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Celsius to Fahrenheit" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Celsius", + ) - try: - temp_c = float(sys.argv[1]) - result = convert.C2F(temp_c) - print(f"{temp_c} °C = {result:.2f} °F") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.C2F(args.temperature) + print(f"{args.temperature} °C = {result:.2f} °F") def f2c_main(): """Convert temperature from Fahrenheit to Celsius via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-F2C ") - print("\nConvert temperature from Fahrenheit to Celsius") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Fahrenheit to Celsius" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Fahrenheit", + ) - try: - temp_f = float(sys.argv[1]) - result = convert.F2C(temp_f) - print(f"{temp_f} °F = {result:.2f} °C") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.F2C(args.temperature) + print(f"{args.temperature} °F = {result:.2f} °C") def f2k_main(): """Convert temperature from Fahrenheit to Kelvin via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-F2K ") - print("\nConvert temperature from Fahrenheit to Kelvin") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Fahrenheit to Kelvin" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Fahrenheit", + ) - try: - temp_f = float(sys.argv[1]) - result = convert.F2K(temp_f) - print(f"{temp_f} °F = {result:.2f} K") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.F2K(args.temperature) + print(f"{args.temperature} °F = {result:.2f} K") def k2f_main(): """Convert temperature from Kelvin to Fahrenheit via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-K2F ") - print("\nConvert temperature from Kelvin to Fahrenheit") - sys.exit(1) - - try: - temp_k = float(sys.argv[1]) - result = convert.K2F(temp_k) - print(f"{temp_k} K = {result:.2f} °F") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert temperature from Kelvin to Fahrenheit" + ) + parser.add_argument( + "temperature", + type=float, + metavar="TEMP", + help="Temperature in Kelvin", + ) + + args = parser.parse_args() + result = convert.K2F(args.temperature) + print(f"{args.temperature} K = {result:.2f} °F") diff --git a/fuellib/cli/transport_props_converter.py b/fuellib/cli/transport_props_converter.py index 043c4f3..330f760 100644 --- a/fuellib/cli/transport_props_converter.py +++ b/fuellib/cli/transport_props_converter.py @@ -1,20 +1,21 @@ """Command-line tool to convert transport properties for combustion simulations.""" -import sys +import argparse from .. import convert def eps2K_main(): """Convert Lennard-Jones epsilon from J/mol to K via command line.""" - if len(sys.argv) != 2: - print("Usage: fl-eps2K ") - print("\nConvert Lennard-Jones well depth epsilon from J/mol to Kelvin") - sys.exit(1) + parser = argparse.ArgumentParser( + description="Convert Lennard-Jones well depth epsilon from J/mol to Kelvin" + ) + parser.add_argument( + "epsilon", + type=float, + metavar="EPSILON", + help="Lennard-Jones well depth in J/mol", + ) - try: - epsilon = float(sys.argv[1]) - result = convert.epsilon_to_characteristic_temperature(epsilon) - print(f"Characteristic temperature: {result:.3f} K") - except ValueError: - print(f"Error: '{sys.argv[1]}' is not a valid number") - sys.exit(1) + args = parser.parse_args() + result = convert.epsilon_to_characteristic_temperature(args.epsilon) + print(f"Characteristic temperature: {result:.3f} K") diff --git a/tests/test_source_docstrings.py b/tests/test_source_docstrings.py index 1a55638..8654753 100644 --- a/tests/test_source_docstrings.py +++ b/tests/test_source_docstrings.py @@ -90,9 +90,15 @@ def test_source_function_documentation(self): print("\n") # Add newline to separate from unittest verbose output + # Verify all expected files exist before checking docstrings + for py_file in py_files: + self.assertTrue( + py_file.exists(), + msg=f"Expected file not found: {py_file.relative_to(fuellib_dir.parent)} " + f"(packaging issue or accidental deletion?)", + ) + for py_file in py_files: - if not py_file.exists(): - continue tree = ast.parse(py_file.read_text(encoding="utf-8"), filename=str(py_file)) file_label = py_file.relative_to(fuellib_dir.parent) diff --git a/tests/test_utilities.py b/tests/test_utilities.py index e64594a..0d6560d 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -83,13 +83,13 @@ def test_fl_eps2K_invalid_input(self): """Test fl-eps2K CLI with invalid input.""" returncode, stdout, stderr = self._run_cli_command("fl-eps2K", "not_a_number") self.assertNotEqual(returncode, 0) - self.assertIn("Error", stdout) + self.assertIn("error", stderr) def test_fl_eps2K_no_args(self): """Test fl-eps2K CLI with no arguments.""" returncode, stdout, stderr = self._run_cli_command("fl-eps2K") self.assertNotEqual(returncode, 0) - self.assertIn("Usage", stdout) + self.assertIn("usage", stderr) def test_fl_C2K_basic(self): """Test fl-C2K CLI command.""" @@ -102,13 +102,13 @@ def test_fl_C2K_invalid_input(self): """Test fl-C2K CLI with invalid input.""" returncode, stdout, stderr = self._run_cli_command("fl-C2K", "not_a_number") self.assertNotEqual(returncode, 0) - self.assertIn("Error", stdout) + self.assertIn("error", stderr) def test_fl_C2K_no_args(self): """Test fl-C2K CLI with no arguments.""" returncode, stdout, stderr = self._run_cli_command("fl-C2K") self.assertNotEqual(returncode, 0) - self.assertIn("Usage", stdout) + self.assertIn("usage", stderr) def test_fl_K2C_basic(self): """Test fl-K2C CLI command.""" @@ -121,13 +121,13 @@ def test_fl_K2C_invalid_input(self): """Test fl-K2C CLI with invalid input.""" returncode, stdout, stderr = self._run_cli_command("fl-K2C", "not_a_number") self.assertNotEqual(returncode, 0) - self.assertIn("Error", stdout) + self.assertIn("error", stderr) def test_fl_K2C_no_args(self): """Test fl-K2C CLI with no arguments.""" returncode, stdout, stderr = self._run_cli_command("fl-K2C") self.assertNotEqual(returncode, 0) - self.assertIn("Usage", stdout) + self.assertIn("usage", stderr) if __name__ == "__main__": From e7c6c0d5e994f91805a306138c3dc072b5e6c971 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Tue, 19 May 2026 12:24:35 -0600 Subject: [PATCH 47/48] Update version for PyPi --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ce6fe1e..fd7cbdd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "3.0.0a3" +version = "3.0.0a4" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"} From cab99c1b67a34db6ad5b6ddae54008c6bd3ef2f0 Mon Sep 17 00:00:00 2001 From: d-montgomery Date: Wed, 20 May 2026 12:14:33 -0600 Subject: [PATCH 48/48] Change default export dir for exporters --- fuellib/exporters/converge.py | 10 +++++----- fuellib/exporters/pele.py | 10 +++++----- pyproject.toml | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/fuellib/exporters/converge.py b/fuellib/exporters/converge.py index e69d94b..8189ebf 100644 --- a/fuellib/exporters/converge.py +++ b/fuellib/exporters/converge.py @@ -146,7 +146,7 @@ def export_converge( :type fuel: fl.fuel :param path: Directory to save the input file. - :type path: str, optional (default: current directory/exportData) + :type path: str, optional (default: current working directory) :param units: Units for the properties ("mks" for SI, "cgs" for CGS). :type units: str, optional (default: "mks") @@ -170,7 +170,7 @@ def export_converge( :raises TypeError: If fuel object is not a FuelLib fuel instance """ if path is None: - path = os.path.join(os.getcwd(), "exportData") + path = os.getcwd() # Input validation if not hasattr(fuel, "compounds") or not hasattr(fuel, "Y_0"): @@ -526,7 +526,7 @@ def main(): :type --temp_step: float, optional (default: 10 K) :param --export_dir: Directory to export the properties. - :type --export_dir: str, optional (default: current directory/exportData) + :type --export_dir: str, optional (default: current working directory) :param --export_mix: Whether to export individual component or mixture properties. :type --export_mix: bool, optional (default: False) @@ -601,9 +601,9 @@ def main(): parser.add_argument( "-o", "--export_dir", - default=os.path.join(os.getcwd(), "exportData"), + default=os.getcwd(), metavar="PATH", - help="Directory to export the properties (optional, default: ./exportData).", + help="Directory to export the properties (optional, default: current working directory).", ) # Optional argument for exporting mixture properties diff --git a/fuellib/exporters/pele.py b/fuellib/exporters/pele.py index c4e63d2..0f75de9 100644 --- a/fuellib/exporters/pele.py +++ b/fuellib/exporters/pele.py @@ -248,7 +248,7 @@ def export_pele( :type fuel: fuel object :param path: Directory to save the input file. - :type path: str, optional (default: current directory/exportData) + :type path: str, optional (default: current working directory) :param units: Units for the properties ("mks" for SI, "cgs" for CGS). :type units: str, optional (default: "mks") @@ -278,7 +278,7 @@ def export_pele( :raises TypeError: If fuel object is not a FuelLib fuel instance """ if path is None: - path = os.path.join(os.getcwd(), "exportData") + path = os.getcwd() # Input validation if not hasattr(fuel, "compounds") or not hasattr(fuel, "Y_0"): @@ -524,7 +524,7 @@ def main(): :param --use_pp_keys: Use the PelePhysics key for each compound (True or False). Default is True. :type --use_pp_keys: bool, optional - :param --export_dir: Directory to export the properties. Default is "current directory/exportData". + :param --export_dir: Directory to export the properties. Default is the current working directory. :type --export_dir: str, optional :param --export_mix: Option to export mixture properties of the fuel (True or False). Default is False. @@ -608,9 +608,9 @@ def main(): parser.add_argument( "-o", "--export_dir", - default=os.path.join(os.getcwd(), "exportData"), + default=os.getcwd(), metavar="PATH", - help="Directory to export the properties (optional, default: ./exportData).", + help="Directory to export the properties (optional, default: current working directory).", ) # Optional argument for exporting mixture properties diff --git a/pyproject.toml b/pyproject.toml index fd7cbdd..4424b25 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fuellib" -version = "3.0.0a4" +version = "3.0.0a5" description = "FuelLib: A Python library for Group Contribution Method (GCM) calculations of fuel properties" readme = "README.md" license = {text = "BSD-3-Clause"}