{"id":767,"name":"PyBox","description":"A Python based box-model generator and simulator designed for atmospheric chemistry and aerosol studies.","url":"https://github.com/loftytopping/PyBox","last_synced_at":"2026-05-13T12:30:23.411Z","repository":{"id":148043000,"uuid":"130043614","full_name":"loftytopping/PyBox","owner":"loftytopping","description":"A box-model that automatically creates and solves equations used to describe the evolution in atmospheric composition using Python with Numba and, optionally, Fortran.","archived":false,"fork":false,"pushed_at":"2020-11-03T12:57:14.000Z","size":4110,"stargazers_count":40,"open_issues_count":6,"forks_count":10,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-04-21T08:48:34.727Z","etag":null,"topics":["atmospheric-science","chemistry","fortran","numba"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/loftytopping.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-04-18T10:09:33.000Z","updated_at":"2026-02-04T19:05:21.000Z","dependencies_parsed_at":"2023-09-21T19:45:18.446Z","dependency_job_id":null,"html_url":"https://github.com/loftytopping/PyBox","commit_stats":{"total_commits":223,"total_committers":5,"mean_commits":44.6,"dds":"0.22869955156950672","last_synced_commit":"3efd0a69e15dc9ba8f965342ea47d295c7033f40"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/loftytopping/PyBox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loftytopping","download_url":"https://codeload.github.com/loftytopping/PyBox/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32456167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"loftytopping","name":"David Topping","uuid":"12458558","kind":"user","description":"Scientist that loves to code. Passionate about community sharing, research, education and all things nerd. ","email":"","website":"http://davidtoppingsci.com/","location":null,"twitter":null,"company":"Currently University of Manchester","icon_url":"https://avatars.githubusercontent.com/u/12458558?u=8bbcb3e8889afcac7c4182a1c4c83d5b5c56c211\u0026v=4","repositories_count":10,"last_synced_at":"2024-06-11T15:36:57.819Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/loftytopping","funding_links":[],"total_stars":71,"followers":83,"following":9,"created_at":"2023-03-27T11:45:44.486Z","updated_at":"2024-06-11T15:36:59.171Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loftytopping","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loftytopping/repositories"},"packages":[],"commits":{"id":1254391,"full_name":"loftytopping/PyBox","default_branch":"master","total_commits":223,"total_committers":5,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":44.6,"dds":0.22869955156950672,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-05-10T11:03:18.857Z","last_synced_commit":"3efd0a69e15dc9ba8f965342ea47d295c7033f40","created_at":"2023-03-27T11:33:25.689Z","updated_at":"2026-05-10T11:03:14.597Z","committers":[{"name":"David Topping","email":"david.topping@manchester.ac.uk","login":"loftytopping","count":172},{"name":"David Topping","email":"davidtopping@Davids-Air-2.broadband","login":null,"count":30},{"name":"David Topping","email":"davidtopping@Davids-MacBook-Air-2.local","login":null,"count":17},{"name":"mccikdt3","email":"mccikdt3@e-losxeahv29.local","login":null,"count":2},{"name":"David Topping","email":"davidtopping@Davids-Air.broadband","login":null,"count":2}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-12T00:00:09.062Z","repositories_count":6233304,"commits_count":894841676,"contributors_count":34898849,"owners_count":1151822,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"loftytopping/PyBox","html_url":"https://github.com/loftytopping/PyBox","last_synced_at":"2026-04-24T03:01:36.788Z","status":"error","issues_count":13,"pull_requests_count":0,"avg_time_to_close_issue":629054.5714285715,"avg_time_to_close_pull_request":null,"issues_closed_count":7,"pull_requests_closed_count":0,"pull_request_authors_count":0,"issue_authors_count":6,"avg_comments_per_issue":1.0,"avg_comments_per_pull_request":null,"merged_pull_requests_count":0,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":1,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":0.0,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-09T10:44:19.477Z","updated_at":"2026-04-24T03:01:36.788Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/loftytopping%2FPyBox/issues","issue_labels_count":{"enhancement":5},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":8,"OWNER":5},"pull_request_author_associations_count":{},"issue_authors":{"loftytopping":5,"dvalters":3,"lheagy":2,"rschofield":1,"gmichals":1,"pianist1900":1},"pull_request_authors":{},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-08T00:00:21.527Z","repositories_count":14533454,"issues_count":34195768,"pull_requests_count":112116611,"authors_count":11257319,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[{"login":"loftytopping","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/loftytopping"}],"active_maintainers":[]},"events":{"total":{"ForkEvent":1,"IssuesEvent":1,"WatchEvent":5},"last_year":{}},"keywords":["atmospheric-science","chemistry","fortran","numba"],"dependencies":[{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2023-09-21T19:45:17.683Z","updated_at":"2023-09-21T19:45:17.683Z","repository_link":"https://github.com/loftytopping/PyBox/blob/master/Dockerfile","dependencies":[{"id":13856857862,"package_name":"ubuntu","ecosystem":"docker","requirements":"18.04","direct":true,"kind":"build","optional":false}]},{"ecosystem":"pypi","filepath":"environment.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:45:18.016Z","updated_at":"2023-09-21T19:45:18.016Z","repository_link":"https://github.com/loftytopping/PyBox/blob/master/environment.yml","dependencies":[]}],"score":5.438079308923196,"created_at":"2023-09-11T11:54:35.878Z","updated_at":"2026-05-13T12:30:23.412Z","avatar_url":"https://github.com/loftytopping.png","language":"Python","category":"Atmosphere","sub_category":"Atmospheric Chemistry and Aerosol","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# PyBox  [![DOI](http://joss.theoj.org/papers/10.21105/joss.00755/status.svg)](https://doi.org/10.21105/joss.00755)\n\nPyBox is a Python based box-model generator and simulator designed for atmospheric chemistry and aerosol studies. The first phase of the PyBox project is to develop a gas phase model, using the reaction information within the [Master Chemical Mechanism (MCM)](http://mcm.leeds.ac.uk/MCM/) as the basis, coupled with an idealised sectional aerosol model. PyBox also relates component properties, using molecular structural information, through the [UManSysProp](http://umansysprop.seaes.manchester.ac.uk) informatics suite.  Any public release will occur according to new processes added, agreement from any partner contributions and/or associated peer-review papers.\n\nPlease check the project wiki page for more information on updates and planned releases. You can also check the current PyBox documentation at https://pybox.readthedocs.io/en/latest/\n\nThis project is licensed under the terms of the GNU General Public License v3.0, as provided with this repository. \n\n# Table of contents\n1. [Model overview](#Model-overview)\n2. [Dependencies and installation](#Dependencies)\n     * 2a. [Using your own machine](#own)\n     * 2b. [Binder](#Binder)\n     * 2c. [Docker](#Docker)\n3. [Folder structure and running the model](#Folder-Structure)\n4. [Unit tests](#Automated-unit-tests)\n5. [Contributing](#Contributing)\n6. [Code of Conduct](#Code-of-Conduct)\n7. [Citation](#Citation)\n\n## Model overview\u003ca name=\"Model-overview\"\u003e\u003c/a\u003e\n\nPyBox works on the basis of reading a file that defines reactions between compounds in the gas phase and the associated reaction coefficient. For example, take the MCM [Alpha-Pinene](https://en.wikipedia.org/wiki/Alpha-Pinene) chemical mechanism file  'MCM_APINENE.eqn.txt' stored in the 'mechanism_files' directory of PyBox. This contains the following snippet of text:\n\n     {125.} \t C96OOH + OH = C96O2 : \t1.90D-12*EXP(190/TEMP) \t;\n     {126.} \t C96OOH + OH = NORPINAL + OH : \t1.30D-11 \t;\n     {127.} \t C96OOH = C96O + OH : \tJ(41)+J(22) \t;\n     {128.} \t C96NO3 + OH = NORPINAL + NO2 : \t2.88D-12 \t;\n     {129.} \t C96NO3 = C96O + NO2 : \tJ(53)+J(22) \t;\n     {130.} \t C96O = C97O2 : \t4.20D+10*EXP(-3523/TEMP) \t;\n     {131.} \t C96OH + OH = NORPINAL + HO2 : \t7.67D-12 \t;\n     {132.} \t C96OH = C96O + HO2 : \tJ(22) \t;\n\nWhere the equation number is defined first, then the reactants/products along with a defined rate coefficient. This equation file is parsed by functions in 'Parse_eqn_file.py', providing information that can be used to set up and solve the relevant ordinary differential equations (ODEs) to simulate the evolution of the chemical mechanism.  Each component in this chemical mechanism also has an associated record of chemical structure in the form of a [SMILES string](http://www.daylight.com/dayhtml/doc/theory/theory.smiles.html). This information is carried in a .xml file, provided by the MCM, and stored in the root directory of PyBox. Why is this important? Well, this information is taken by the [UManSysProp](http://umansysprop.seaes.manchester.ac.uk) informatics suite and allows us to predict properties of each compound that helps us predict whether they are likely to remain in the gas phase or condense to an existing particulate phase through gas-to-particle partitioning. Before we take a look at the directory structure provided in this repository, lets deal with the dependencies.\n\n## Dependencies and installation \u003ca name=\"Dependencies\"\u003e\u003c/a\u003e\n\nPyBox has been built in the [Anaconda environment](https://www.anaconda.com/download/#macos). [Assimulo](http://www.jmodelica.org/assimulo) is *currently* the numerical core of PyBox. The Assimulo Ordinary Differential Equation (ODE) solver package allows us to use solvers designed for stiff systems. [UManSysProp](http://umansysprop.seaes.manchester.ac.uk) is used to automate predictions of pure component and mixture properties to allow gas-to-particle partitioning simulations *if you need to run the partitioning option*. \n \n### 2(a). Using your own machine\u003ca name=\"own\"\u003e\u003c/a\u003e\n\nHaving a Python distribution on your own machine is attractive for a number of reasons, not least gaining familiarity with building projects in your own time. If you havent already, I would reccomend installing the Anaconda distribution. You can download a copy using [this link](https://www.anaconda.com/products/individual). That page will give you the option to download a version for Windows, Mac or Linux. Download the graphical installer and, typically, accept all options. Once you have installed this, now open a terminal. On Windows, go to the menu of options and find 'Anaconda Prompt' under the Anaconda folder. On a Mac, go to Finder -\u003e Utilities -\u003e Terminal. If on a Mac, when in this terminal when you type:\n\n\u003e Python\n\nDo you see the reference to Anaconda? For example, you may see something *similar* to:\n\n\u003e Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32\n\nNow we are going to create a virtual environment to run our notebooks in. Virtal environments are a great way of maintaining a 'work space' that is seperate to your default installation. For example, if you are going to start installing lots of bespoke modules, you may sometimes come across a clash of version numbers which then becomes tricky to maintain. In the worst case scenario, this would require a re-installation of Python. So lets create a virtual environment for our project. You can switch-on and switch-ff these virtual environments from the command line/terminal whenever you need them.\n\nIf you are on Windows, go back to the Anaconda prompt. If you are on a Mac or Linux, go back to ther terminal. First we need to clone this repository. We should use Git for this, becuase with Git you can keep pulling updates from this repository. If you do not already have Git installed on your machine, you can get it from the [download page](https://git-scm.com/downloads). Once you have installed this, at the prompt/terminal type:\n\n\u003e git clone https://github.com/loftytopping/PyBox.git\n\nThis will download the project to the location you are in already. You can change this location before running the above command, or move the folder later. Github also gives you the option to download a ZIP file of the entire project if you cannot or do not want to use Git. Once you have the project downloaded, open a command propmt/terminal and navigate to the project folder. We are now going to use the file 'environment.yml' to create a new virtual environment. Run the following command:\n\n\u003e conda env create -f environment.yml\n\nYou will see a number of packages being downloaded, eventually, by the conda package manager which is part of the Anaconda distribution. Accept any requests and, when finished, you will see a message that resembles the following:\n\n    To activate this environment, use\n    \n        $ conda activate PyBox\n    \n    To deactivate an active environment, use\n    \n        $ conda deactivate\n        \nThese are the commands for swithing on/off this new virtual environment. Let's switch it on. Type the following in the command prompt/terminal:\n\n\u003e conda activate PyBox\n\nIn the command prompt, you will see the name (PyBox) appear from (base). Now we can run the default gas phase example. Still within the project folder, type the following:\n\n\u003e python Gas_simulation.py \n\n### 2(b). Binder \u003ca name=\"Binder\"\u003e\u003c/a\u003e\n\nIf you do not, or cannot, run Python from your own machine we have provided the ability for you to interact with these files using Binder. The Binder project offers an easy place to share computing environments to everyone. It allows users to specify custom environments and share them with a [single link](https://jupyter.org/binder). Indeed, if you click the link below this will spin-up an individual session for you. Please bare in mind it can take a while to start, and if idle for a short period these sessions will stop. However you can download your notebook file during the session. Everytime you start a Binder link, it will start from scratch.\n\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/loftytopping/Env_modelling/master)\n\n\n### 2(c). Using a Docker container \u003ca name=\"Docker\"\u003e\u003c/a\u003e\n\nAs a method for a 'fully automated setup' I have provided the option to setup and run PyBox within a Docker container. I have provided a Dockerfile that will automatically build all dependencies within a new container based on the Ubuntu:16.04 image. To build the new image, assuming you have Docker installed, run the following command in the directory of the supplied Dockerfile:\n\n\u003e docker build -t pybox .\n\nAfter this has completed [which may take some time], type the following to see your new image listed:\n\n\u003e docker images\n\nTo create and run a new container based on this image, with a name 'project_pybox', type:\n\n\u003e docker run --name=project_pybox -it pybox\n\nThis will take you in to the container. So, lets run the gas phase model in PyBox whilst you are there. Change directory to where PyBox is located:\n\n\u003e cd /Code/Git_repos/PyBox/\n\nLets run the default simulation:\n\n\u003e python Gas_simulation.py \n\nDont worry about the error message regarding the Matplotlib plots. This is a result of working in a Docker container. For those not familiar with standard Docker commands, please check the brief instructions provided in the Docker_README.txt file where I give some additional examples on how to stop, restart and delete the PyBox container. \n\n## Folder structure and running the model \u003ca name=\"Folder-Structure\"\u003e\u003c/a\u003e\n\nBefore we run PyBox, lets make sure you have the correct link to the UManSysProp suite. Once you have cloned the repository, you will need to add the location of it in the python script 'Property_calculation.py' within the 'Aerosol' directory of PyBox. As with the Assimulo package, you can test this import by opening an interactive Python shell and typing:\n\n\u003e import sys\n\n\u003e sys.path.append('\u003c-- add your path here --\u003e/UManSysProp_public/')\n\n\u003e from umansysprop import boiling_points\n\n\u003e from umansysprop import vapour_pressures\n\n\u003e from umansysprop import critical_properties\n\n\u003e from umansysprop import liquid_densities\n\n\u003e from umansysprop import partition_models\n\n\u003e from umansysprop.forms import CoreAbundanceField\n\nIf you are happy all dependencies are installed and working, to run PyBox 'out of the box', type the following in the root directory:\n\n\u003e python Gas_simulation.py\n\nIf you are not running within a Docker container, you will see a plot displaying the concentration of two compounds over time. To understand what this simulation has actually done, let us now discuss the repository structure.\n\n### Directory layout\n\n    .                           # Gas phase only model [using Numba]\n    ├── f2py                    # Gas phase only model [using f2py Fortran to Python Interface Generator] \n    ├── Aerosol                 # Coupled gas and gas-to-particle partitioning routines\n    |------f2py                 # Coupled gas and gas-to-particle partitioning routines [using f2py]\n    ├── test                    # Automated unit tests\n    |------data                 # Data used in the automated unit tests\n    ├── mechanism_files         # Copies of chemical mechanisms\n    ├── LICENSE\n    └── README.md\n    \nCurrently there are two versions of the gas phase only model; one held within the root directory and the other in folder 'f2py':\n   \n#### 1) Python [using Numba]\nThis is the default version in the root directory. Recall the parsing of the equation file? After new python scripts are created for use within the ODE solvers, the [Numba](https://numba.pydata.org) package then compiles these before the first simulation. Numba does this as the modules are imported. You will therefore find the initial pre-simulation stages of the first simulation will take some time, but not in subsequent model simulations if you wish to study a fixed chemical mechanism. In this case Numba will not need to re-compile even when you start with new initial conditions. Once you have conducted your first simulation, you may change the following within 'Gas_simulation.py':\n\n    files_exist = False\n\nto\n\n    files_exist = True\n\nThe current version of PyBox provides you with an out-of-the-box example. It is based on the MCM representation of the degredation of [Alpha-Pinene](https://en.wikipedia.org/wiki/Alpha-Pinene). The Alpha-Pinene mechanism file is stored within the 'mechanism_files' folder and referenced in the 'Gas_simulation.py' file through: \n\n    filename='MCM_APINENE'\n\nAs already noted, to run the model, once you are happy all dependecies are installed, type the following from the root directory:\n\n\u003e python Gas_simulation.py\n\nYou can modify the ambient conditions and species concentrations in 'Gas_simulation.py'. First you can define ambient conditions and simulation time, the default given as :\n\n    temp=288.15 # Kelvin\n    RH=0.5 # RH/100% [range 0-0.99]\n    #Define a start time \n    hour_of_day=12.0 # 24 hr format\n    simulation_time= 7200.0 # seconds\n    batch_step=100.0 # seconds\n    \nThe 'batch_step' variable allows us to define when to stop/start/record outputs from our simulation for later use. The ODE methods can provide output at every internal time-step, so it is up to the user to use this information, or not, within the output of the 'ODE_solver.py' script.  Following this, the default option for species concentrations is provided as:\n\n    # Define initial concentrations, in pbb, of species using names from KPP file\n    species_initial_conc=dict()\n    species_initial_conc['O3']=18.0\n    species_initial_conc['APINENE']=30.0\n\nIf you are not running within a Docker container, if you run 'Gas_simulation.py' as provided you will see a simple plot of Alpha-Pinene concentration decay over 2 hours.\n\n#### 2) Python + Fortran [using f2py Fortran to Python Interface Generator] \nWhilst the above variant uses the Numba package, in the folder 'f2py' the same model is constructed using the [F2Py](https://docs.scipy.org/doc/numpy/f2py/)package, where functions that define the ODEs are converted into pre-compiled Fortran modules with the option to use [OpenMP](http://www.openmp.org) to exploit the number of cores available to you on any given platform. As before, please check the relevant files for defining initial conditions, species concetrations, and expect some compilation time during the first run. To run this simulation, type the following from the f2py directory:\n\n\u003e python Gas_simulation_f2py.py\n\n\u003cimg src=\"images/Example_deafult_gas_simulation.png\" width=\"600\"\u003e\n\u003cem\u003eExample output from the default gas phase simulation of Alpha-Pinene\u003c/em\u003e\n\n### Aerosol\n\nIn the Aerosol folder you can find gas-to-particle partitioning frameworks. There are two examples provided. The first, within the f2py folder, simulates the partitioning of compounds to 16 size bins again from the Alpha-Pinene chemical mechanism as this evolves over time. This uses properties calculated from the UManSysProp suite. To run the model, once you are happy all dependencies are installed, type the following from the Aerosol/f2py directory:\n\n\u003e python Aerosol_simulation_f2py.py\n\nIn addition to the species concentrations and ambient conditions, you can change the size distribution and number of size bins in the following:\n\n    num_bins=16 #Number of size bins\n    total_conc=100 #Total particles per cc\n    std=2.2 #Standard Deviation\n    lowersize=0.01 #microns\n    uppersize=1.0 #microns\n    meansize=0.2 #microns\n    \nPlease note this does require some knowledge of typical aerosol size distributions and reasonable number concentrations. Within the folder 'Fixed_yield' is a partitioning only model, using fixed total concentrations of compounds in the gas phase. It is important to note that much more work is planned on the aerosol model since there are multiple properties and processes that affect gas-to-particle partitioning. The current version is beyond the most basic used in atmospheric research. Nonetheless, PyBox is designed with the community in mind and my goal is to include all relevant processes. This ethos is captured in the proceeding note on contributing to the project.\n\n\n\u003cimg src=\"images/Example_SOA_simulation.png\" width=\"600\"\u003e\n\u003cem\u003eExample total organic aerosol loading from the default aerosol simulation of Alpha-Pinene\u003c/em\u003e\n\n\u003cimg src=\"images/Example_SOA_contributions.png\" width=\"600\"\u003e\n\u003cem\u003eExample normalised contributions per size bin for the default fixed yield simulations\u003c/em\u003e\n\n\n## Unit tests\u003ca name=\"Automated-unit-tests\"\u003e\u003c/a\u003e \n\nWithin the folder tests, run the following command:\n\n\u003e python test_modules.py -v\n\nThis will use the unittest Python module to test the output of generated functions used within the ODE solvers against pre-generated .npy files provided in the data subfolder of tests.\n\n## Contributing\u003ca name=\"Contributing\"\u003e\u003c/a\u003e\n\nContributions to PyBox are more than welcome. Box-models of aerosol systems can rely on many different process representations. It is thus difficult to define a 'standard' full complexity model. There are many developments planned for PyBox, which you can follow from a scientific perspective in the project wiki. I am therefore very happy to discuss ideas for improvement and how to add/remove features.  There are two key rules to follow:\n\n - Any addition must include appropriate unit tests\n - Any addition from a scientific process perspective must include a link to a peer-reviewed paper before it is accepted into the public branch\n\nPlease use the issue tracker at https://github.com/loftytopping/PyBox/issues if you want to notify me of an issue or need support. If you want to contribute, please either create an issue or make a pull request. Alternatively, come and see us in Manchester and/or lets meet for a coffee and a chat!\n\n## Code of Conduct\u003ca name=\"Code-of-Conduct\"\u003e\u003c/a\u003e\n\nPlease note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its [terms](code-of-conduct.md). There needs to be greater support and recognition for software development and developers. PyBox can act as a vehicle for enabling better collaboration and therefore better science.\n\n## Citation\u003ca name=\"Citation\"\u003e\u003c/a\u003e\n\nIf you use PyBox in any study we ask you reference our paper in the Journal of Open Source Software [![DOI](http://joss.theoj.org/papers/10.21105/joss.00755/status.svg)](https://doi.org/10.21105/joss.00755). Citation: Topping et al., (2018). PyBox: An automated box-model generator for atmospheric chemistry and aerosol simulations. . Journal of Open Source Software, 3(28), 755, https://doi.org/10.21105/joss.00755\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.21105/joss.00755"],"works":{"https://doi.org/10.21105/joss.00755":{"id":"https://openalex.org/W2885467602","doi":"https://doi.org/10.21105/joss.00755","title":"PyBox: An automated box-model generator for atmospheric chemistry and aerosol simulations.","display_name":"PyBox: An automated box-model generator for atmospheric chemistry and aerosol simulations.","publication_year":2018,"publication_date":"2018-08-15","ids":{"openalex":"https://openalex.org/W2885467602","doi":"https://doi.org/10.21105/joss.00755","mag":"2885467602"},"language":"en","primary_location":{"is_oa":true,"landing_page_url":"https://doi.org/10.21105/joss.00755","pdf_url":"https://joss.theoj.org/papers/10.21105/joss.00755.pdf","source":{"id":"https://openalex.org/S4210214273","display_name":"Journal of open source software","issn_l":"2475-9066","issn":["2475-9066"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310315853","host_organization_name":"Open Journals","host_organization_lineage":["https://openalex.org/P4310315853"],"host_organization_lineage_names":["Open Journals"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true},"type":"article","type_crossref":"journal-article","open_access":{"is_oa":true,"oa_status":"gold","oa_url":"https://joss.theoj.org/papers/10.21105/joss.00755.pdf","any_repository_has_fulltext":false},"authorships":[{"author_position":"first","author":{"id":"https://openalex.org/A5073832071","display_name":"David Topping","orcid":"https://orcid.org/0000-0001-8247-9649"},"institutions":[],"countries":[],"is_corresponding":false,"raw_author_name":"David Topping","raw_affiliation_string":"School of Earth and Environmental Sciences","raw_affiliation_strings":["School of Earth and Environmental Sciences"]},{"author_position":"middle","author":{"id":"https://openalex.org/A5040739266","display_name":"Paul Connolly","orcid":"https://orcid.org/0000-0002-3294-7405"},"institutions":[],"countries":[],"is_corresponding":false,"raw_author_name":"Paul Connolly","raw_affiliation_string":"School of Earth and Environmental Sciences","raw_affiliation_strings":["School of Earth and Environmental Sciences"]},{"author_position":"last","author":{"id":"https://openalex.org/A5083690545","display_name":"Jonathan P. Reid","orcid":"https://orcid.org/0000-0001-6022-1778"},"institutions":[],"countries":[],"is_corresponding":false,"raw_author_name":"Jonathan Reid","raw_affiliation_string":"","raw_affiliation_strings":[]}],"countries_distinct_count":0,"institutions_distinct_count":0,"corresponding_author_ids":[],"corresponding_institution_ids":[],"apc_list":{"value":0,"currency":"USD","value_usd":0,"provenance":"doaj"},"apc_paid":{"value":0,"currency":"USD","value_usd":0,"provenance":"doaj"},"has_fulltext":true,"fulltext_origin":"pdf","cited_by_count":14,"cited_by_percentile_year":{"min":91,"max":92},"biblio":{"volume":"3","issue":"28","first_page":"755","last_page":"755"},"is_retracted":false,"is_paratext":false,"keywords":[{"keyword":"atmospheric chemistry","score":0.5369},{"keyword":"simulations","score":0.3599},{"keyword":"box-model","score":0.25}],"concepts":[{"id":"https://openalex.org/C2779345167","wikidata":"https://www.wikidata.org/wiki/Q104541","display_name":"Aerosol","level":2,"score":0.68922734},{"id":"https://openalex.org/C2780992000","wikidata":"https://www.wikidata.org/wiki/Q17016113","display_name":"Generator (circuit theory)","level":3,"score":0.55855864},{"id":"https://openalex.org/C2992995325","wikidata":"https://www.wikidata.org/wiki/Q4951592","display_name":"Box model","level":2,"score":0.5154041},{"id":"https://openalex.org/C91586092","wikidata":"https://www.wikidata.org/wiki/Q757520","display_name":"Atmospheric sciences","level":1,"score":0.39298776},{"id":"https://openalex.org/C39432304","wikidata":"https://www.wikidata.org/wiki/Q188847","display_name":"Environmental science","level":0,"score":0.37890607},{"id":"https://openalex.org/C153294291","wikidata":"https://www.wikidata.org/wiki/Q25261","display_name":"Meteorology","level":1,"score":0.35058814},{"id":"https://openalex.org/C21880701","wikidata":"https://www.wikidata.org/wiki/Q2144042","display_name":"Process engineering","level":1,"score":0.34631932},{"id":"https://openalex.org/C121332964","wikidata":"https://www.wikidata.org/wiki/Q413","display_name":"Physics","level":0,"score":0.26780534},{"id":"https://openalex.org/C127413603","wikidata":"https://www.wikidata.org/wiki/Q11023","display_name":"Engineering","level":0,"score":0.22616383},{"id":"https://openalex.org/C97355855","wikidata":"https://www.wikidata.org/wiki/Q11473","display_name":"Thermodynamics","level":1,"score":0.1916804},{"id":"https://openalex.org/C163258240","wikidata":"https://www.wikidata.org/wiki/Q25342","display_name":"Power (physics)","level":2,"score":0.11503014}],"mesh":[],"locations_count":1,"locations":[{"is_oa":true,"landing_page_url":"https://doi.org/10.21105/joss.00755","pdf_url":"https://joss.theoj.org/papers/10.21105/joss.00755.pdf","source":{"id":"https://openalex.org/S4210214273","display_name":"Journal of open source software","issn_l":"2475-9066","issn":["2475-9066"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310315853","host_organization_name":"Open Journals","host_organization_lineage":["https://openalex.org/P4310315853"],"host_organization_lineage_names":["Open Journals"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true}],"best_oa_location":{"is_oa":true,"landing_page_url":"https://doi.org/10.21105/joss.00755","pdf_url":"https://joss.theoj.org/papers/10.21105/joss.00755.pdf","source":{"id":"https://openalex.org/S4210214273","display_name":"Journal of open source software","issn_l":"2475-9066","issn":["2475-9066"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310315853","host_organization_name":"Open Journals","host_organization_lineage":["https://openalex.org/P4310315853"],"host_organization_lineage_names":["Open Journals"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true},"sustainable_development_goals":[],"grants":[],"referenced_works_count":3,"referenced_works":["https://openalex.org/W2245493112","https://openalex.org/W2289542121","https://openalex.org/W4254689893"],"related_works":["https://openalex.org/W3124600784","https://openalex.org/W2967199467","https://openalex.org/W2018121015","https://openalex.org/W282229461","https://openalex.org/W2093559246","https://openalex.org/W2972540082","https://openalex.org/W2025592420","https://openalex.org/W2039329700","https://openalex.org/W1556148645","https://openalex.org/W3175849068"],"ngrams_url":"https://api.openalex.org/works/W2885467602/ngrams","abstract_inverted_index":null,"cited_by_api_url":"https://api.openalex.org/works?filter=cites:W2885467602","counts_by_year":[{"year":2023,"cited_by_count":1},{"year":2022,"cited_by_count":5},{"year":2021,"cited_by_count":4},{"year":2020,"cited_by_count":3},{"year":2019,"cited_by_count":1}],"updated_date":"2023-12-16T22:56:29.233456","created_date":"2018-08-22"}},"citation_counts":{"https://doi.org/10.21105/joss.00755":14},"total_citations":14,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/767","html_url":"https://ost.ecosyste.ms/projects/767"}