Repository: uncscode/particula

Issue:
document particle.py

Discussion:
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.36%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.78 ⭐ | 0.92 ⭐ | 0.14 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 30.95 ⭐ | 31.48 ⭐ | 0.53 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.14 ⭐ | 6.14 ⭐ | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **84.97%** ⭐| **84.61%** ⭐| **-0.36%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 225 | 227 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.61% ⭐ | -0.36% 👎|

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=a8ca8372b136ed86b6ac72f06937c9f2210ac9b3&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.34%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.78 ⭐ | 0.92 ⭐ | 0.14 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 30.95 ⭐ | 31.43 ⭐ | 0.48 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.14 ⭐ | 6.14 ⭐ | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **84.97%** ⭐| **84.63%** ⭐| **-0.34%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 225 | 227 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.63% ⭐ | -0.34% 👎|

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=1b567730e577453d67c73e27ba5bf3b57e7a6ccc&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.34%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.78 ⭐ | 0.92 ⭐ | 0.14 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 30.95 ⭐ | 31.43 ⭐ | 0.48 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.14 ⭐ | 6.14 ⭐ | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **84.97%** ⭐| **84.63%** ⭐| **-0.34%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 225 | 227 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.63% ⭐ | -0.34% 👎|

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=e6185bc74af9f0e20f61c0bda33754fb18963a54&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.34%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.78 ⭐ | 0.92 ⭐ | 0.14 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 30.95 ⭐ | 31.43 ⭐ | 0.48 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.14 ⭐ | 6.14 ⭐ | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **84.97%** ⭐| **84.63%** ⭐| **-0.34%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 225 | 227 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.63% ⭐ | -0.34% 👎|

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=57aec4b7d5776ef4133c038a5cbf108adfc28504&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.34%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.78 ⭐ | 0.92 ⭐ | 0.14 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 30.95 ⭐ | 31.43 ⭐ | 0.48 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.14 ⭐ | 6.14 ⭐ | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **84.97%** ⭐| **84.63%** ⭐| **-0.34%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 225 | 227 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.63% ⭐ | -0.34% 👎|

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=2b6118fe0dd6e3f8ba9741d6c2e180a1e7c7ce23&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=f422a384961101796dc4cc6ff82a16da78381653&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=be6bb2461114ff1c1ff726281f1bf1ab407d7fe4&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=2863ac7f999e6beaf6856df3a294c34e6de3d6fb&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=fd9caa6cfa9bad80ac16529620af279f66ade701&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=7c5e0a2a5260eef703147e354b2acf0e1569c470&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=81a6383fec836df558d8dbc61b3493b26f54be98&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=2f2f26fd91f407ae1fb9c773f3c7270f960f9fe1&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=5be3229e23ffd4c3a599e7fc3ebf239449eadaf9&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=6edbfdce027263f186b4833f07b7e1ac85a20cdc&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=844993dbb17ccf2a901d300243a5ff5855560eeb&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!
sourcery-ai[bot]: # Sourcery Code Quality Report

❌ &nbsp;Merging this PR will **decrease** code quality in the affected files by **0.17%**.

| Quality metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| [Complexity](https://docs.sourcery.ai/GitHub/Quality-Report/#complexity) | 0.43 ⭐ | 0.49 ⭐ | 0.06 👎 |
| [Method Length](https://docs.sourcery.ai/GitHub/Quality-Report/#method-length) | 43.56 ⭐ | 43.88 ⭐ | 0.32 👎 |
| [Working memory](https://docs.sourcery.ai/GitHub/Quality-Report/#working-memory) | 6.33 🙂 | 6.33 🙂 | 0.00  |
| **[Quality](https://docs.sourcery.ai/GitHub/Quality-Report/#quality-score)** | **82.24%** ⭐| **82.07%** ⭐| **-0.17%** 👎 |

| Other metrics | Before | After | Change |
| --- | :---: | :---: | :---: |
| Lines | 439 | 441 | 2 |

| Changed files | Quality Before | Quality After | Quality Change |
| --- | :---: | :---: | :---: |
| particula/particle.py | 84.97% ⭐ | 84.66% ⭐ | -0.31% 👎|
| particula/tests/particle_test.py | 78.95% ⭐ | 78.95% ⭐ | 0.00% |

Here are some functions in these files that still need a tune-up:

| File | Function | Complexity | Length | Working Memory | Quality | Recommendation |
| --- | --- | :---: | :---: | :---: | :---: | --- |
| particula/tests/particle_test.py | test\_multiple\_shapes | 0 ⭐ | 280 ⛔ | 6 ⭐ | 63.02% 🙂 | Try splitting into smaller methods |
| particula/particle.py | Particle.\_coag\_prep | 0 ⭐ | 39 ⭐ | 13 😞 | 73.07% 🙂 | Extract out complex expressions |
| particula/tests/particle_test.py | test\_getters | 0 ⭐ | 47 ⭐ | 12 😞 | 73.34% 🙂 | Extract out complex expressions |

## Legend and Explanation

The emojis denote the absolute quality of the code:

 - ⭐ excellent
 - 🙂 good
 - 😞 poor
 - ⛔ very poor


The 👍 and 👎 indicate whether the quality has improved or gotten worse with this pull request.

***

Please see our documentation [here](https://docs.sourcery.ai/GitHub/Quality-Report/) for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Help us [improve](https://research.typeform.com/to/j06Spdfr?type=quality_report&github_login=ngam&base_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&base_remote_ref=refs%2Fpull%2F199%2Fhead&base_ref=main&base_sha=b2c33c208c733ad4e55621110934af887add5aef&head_repo=https%3A%2F%2Fgithub.com%2Funcscode%2Fparticula.git&head_ref=sourcery%2Fpull-199&base_pr_number=199&base_pr_state=open) this quality report!

Patch:
diff --git a/docs/_config.yml b/docs/_config.yml
index a6bd4d638..106a9812e 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -2,7 +2,7 @@ title: "Particula Book"
 author: "particula contributors"
 logo: images/placeholder.png
 execute:
-  execute_notebooks: "auto"
+  execute_notebooks: "force"
 
 launch_buttons:
   notebook_interface: jupyterlab
diff --git a/docs/_toc.yml b/docs/_toc.yml
index 77e7bbd6f..981dc1bc6 100644
--- a/docs/_toc.yml
+++ b/docs/_toc.yml
@@ -5,15 +5,24 @@ parts:
   numbered: false
   chapters:
   - file: getting_started
-- caption: Tutorials
-  numbered: false
-  chapters:
-  - file: tutorials/001_ParticleClass
 - caption: Documentation
   numbered: false
   chapters:
   - file: documentation/environment
   - file: documentation/vapor
+  - file: documentation/particle
+- caption: Utilities
+  numbered: false
+  chapters:
+  - file: documentation/utilities/dynamic_viscosity
+  - file: documentation/utilities/mean_free_path
+  - file: documentation/utilities/distribution_discretization
+  - file: documentation/utilities/radius_cutoff
+  - file: documentation/utilities/particle_mass
+  - file: documentation/utilities/knudsen_number
+  - file: documentation/utilities/slip_correction
+  - file: documentation/utilities/friction_factor
+  - file: documentation/utilities/dimensionless_coagulation
 - caption: Community
   numbered: false
   chapters:
diff --git a/docs/documentation/d000_detailed_documentation.md b/docs/documentation/d000_detailed_documentation.md
deleted file mode 100644
index d79448606..000000000
--- a/docs/documentation/d000_detailed_documentation.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Documentation and Reference
-
-## Coming soon
diff --git a/docs/documentation/environment.ipynb b/docs/documentation/environment.ipynb
index 5bc06ae0e..53c2cafb3 100644
--- a/docs/documentation/environment.ipynb
+++ b/docs/documentation/environment.ipynb
@@ -18,7 +18,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -35,8 +35,8 @@
     "\n",
     "| attribute              | unit        | default value\n",
     "| ---------              | ----        | -------------\n",
-    "| `temperature`          | K           | 298.15\n",
-    "| `pressure`             | Pa          | 101325\n",
+    "| `temperature`          | K           | `298.15`\n",
+    "| `pressure`             | Pa          | `101325`\n",
     "| `dynamic_viscosity`    | Pa s        | `util.dynamic_viscosity`\n",
     "| `molecular_weight`     | kg / mol    | `constants.MOLECULAR_WEIGHT_AIR`\n",
     "| `reference_viscosity`  | Pa s        | `constants.REF_VISCOSITY_AIR_STP`\n",
@@ -49,9 +49,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "temperature is  300 kelvin\n",
+      "pressure is  101325 kilogram / meter / second ** 2\n"
+     ]
+    }
+   ],
    "source": [
     "from particula import u\n",
     "from particula.environment import Environment\n",
@@ -63,9 +72,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "temperature is  300 kelvin\n"
+     ]
+    }
+   ],
    "source": [
     "from particula import u\n",
     "from particula.environment import Environment\n",
@@ -76,27 +93,35 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "temperature is  298.15 kelvin\n"
+     ]
+    }
+   ],
    "source": [
     "from particula import u\n",
     "from particula.environment import Environment\n",
     "\n",
     "EnvThree = Environment()\n",
-    "print(\"temperature is \", EnvTwo.temperature) # will print 298.15 K (the default value)"
+    "print(\"temperature is \", EnvThree.temperature) # will print 298.15 K (the default value)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
     "from particula import u\n",
     "from particula.environment import Environment\n",
     "\n",
-    "EnvWrong = Environment(temperature=300*u.m) # will raise an error"
+    "# EnvWrong = Environment(temperature=300*u.m) # will raise an error"
    ]
   },
   {
@@ -110,7 +135,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Finally, one attribute has a default value from `particula.util`. As explained below, we calculate the dynamic viscosity via the Sutherland formula using the temperature (as well as the reference values of temperature, visocsity, and Sutherland constant). The user can override this calculating by offering a different dynamic viscosity with the attribute `dynamic_viscosity`."
+    "Finally, one attribute has a default value from `particula.util`. As explained below, we calculate the dynamic viscosity via the Sutherland formula using the temperature (as well as the reference values of temperature, viscosity, and Sutherland constant). The user can override this calculating by offering a different dynamic viscosity with the attribute `dynamic_viscosity`."
    ]
   },
   {
@@ -128,23 +153,34 @@
    "source": [
     "### `Environment.dynamic_viscosity()`\n",
     "\n",
-    "The dynamic viscosity is a property of the fluid, defining the resistance of the fluid to its own movement. The dynamic viscosity is calculated using the Sutherland formula ([reference](https://resources.wolframcloud.com/FormulaRepository/resources/Sutherlands-Formula)). The function can be found and is documented in `util.dynamic_vicosity.py`. It takes inputs of `temperature`, `reference_viscosity`, `reference_temperature`, and `sutherland_constant`. It returns a value for the dynamic viscosity at those variables. At default conditions (298.15 K and 101325 Pa), the dynamic viscosity is approximately 1.84e-5 kg/m/s. The Sutherland formula is\n",
-    "\n",
-    "$$\n",
-    "\\mu = \\frac{\\mu_{0}\\, (T/T_{0})^{3/2}\\, (T_{0} + C)}{C + T}\n",
-    "$$\n",
-    "\n",
-    "where $\\mu$ is the dynamic viscosity, $\\mu_{0}$ is the reference dynamic viscosity, $T$ is temperature, $T_{0}$ is the reference temperature, and $C$ is the Sutherland constant."
+    "- [`particula.util.dynamic_viscosity`](./utilities/dynamic_viscosity.ipynb)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "1.8371493734583912×10<sup>-5</sup> kilogram/(meter second)"
+      ],
+      "text/latex": [
+       "$1.8371493734583912\\times 10^{-5}\\ \\frac{\\mathrm{kilogram}}{\\left(\\mathrm{meter} \\cdot \\mathrm{second}\\right)}$"
+      ],
+      "text/plain": [
+       "1.8371493734583912e-05 <Unit('kilogram / meter / second')>"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
     "from particula.environment import Environment\n",
-    "Environment().dynamic_viscoity() # will produce approx 1.84e-5 kg/m/s"
+    "Environment().dynamic_viscosity() # will produce approx 1.84e-5 kg/m/s"
    ]
   },
   {
@@ -153,20 +189,22 @@
    "source": [
     "### `Environment.mean_free_path()`\n",
     "\n",
-    "The mean free path is the average distance of a molecule between collisions with other molecules present in the medium. We use the kinetic theory of gases to calculate the mean free path in an ideal gas as\n",
-    "\n",
-    "$$\n",
-    "\\lambda = \\frac{2 \\mu / p}{(8 \\, \\mathrm{MW} / (\\pi R T))^{1/2}} \n",
-    "$$\n",
-    "\n",
-    "where $\\lambda$ is the mean free path, $\\mu$ is the dynamic viscosity, $p$ is the pressure, $\\mathrm{MW}$ is the molecular weight, $R$ is the gas constant, $T$ is the temperature. As noted above, the user can provide an explicit value for $\\mu$ or it can be calculated using the above formula (that is, the user can provide the inputs to the above formula for $\\mu$). At default conditions, $\\lambda$ is about 66.5 nm."
+    "- [`particula.util.mean_free_path`](./utilities/mean_free_path.ipynb)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "mean free path is  6.647984982685411e-08 meter\n"
+     ]
+    }
+   ],
    "source": [
     "from particula.environment import Environment\n",
     "print(\"mean free path is \", Environment().mean_free_path()) # will produce approx 66.5 nm"
@@ -179,8 +217,8 @@
     "## Notes\n",
     "\n",
     "- While technically allowed, we discourage the users from using vectored temperature and pressure quantities for now. We design `particula` with the intention of having each point in time (calculation) having a unique set of conditions.\n",
-    "- Attributes are called without parantheses, e.g. `Environment().temperature`.\n",
-    "- Methods are called with parantheses, e.g. `Environment().mean_free_path()`."
+    "- Attributes are called without parentheses, e.g. `Environment().temperature`.\n",
+    "- Methods are called with parentheses, e.g. `Environment().mean_free_path()`."
    ]
   },
   {
@@ -190,8 +228,25 @@
   }
  ],
  "metadata": {
+  "interpreter": {
+   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.10.4 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
   "language_info": {
-   "name": "python"
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.4"
   },
   "orig_nbformat": 4
  },
diff --git a/docs/documentation/particle.ipynb b/docs/documentation/particle.ipynb
new file mode 100644
index 000000000..df5b5d541
--- /dev/null
+++ b/docs/documentation/particle.ipynb
@@ -0,0 +1,409 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# The `Particle` Classes\n",
+    "\n",
+    "The `Particle` class is the base class for all particles, whether introduced discretely one by one or as a distribution. In reality, the `Particle` class is based on two intermediate classes: `ParticleDistribution` and `ParticleInstances` to instantiate particle distributions and particles directly, respectively."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The `ParticleDistribution` inherits from the `Vapor` class, with the following added attributes and methods:\n",
+    "\n",
+    "## `ParticleDistribution` attributes\n",
+    "\n",
+    "| attribute    | unit        | default value\n",
+    "| ---------    | ----        | -------------\n",
+    "| `spacing`    |             | `\"linspace\"`\n",
+    "| `nbins`      |             | `1e3`\n",
+    "| `nparticles` |             | `1e5`\n",
+    "| `volume`     | / m^3       | `1e-6`\n",
+    "| `cutoff`     |             | `0.9999`\n",
+    "| `gsigma`     |             | `1.25`\n",
+    "| `mode`       | m           | `1e-7`\n",
+    "| `disttype`   |             | `\"lognormal\"`\n",
+    "\n",
+    "## `ParticleDistribution` methods\n",
+    "\n",
+    "### `ParticleDistribution.pre_radius()`\n",
+    "\n",
+    "The `pre_radius` method uses the attributes `cutoff`, `gsigma`, and `mode` to determine the starting and ending radii according to the utility `cutoff_radius.cut_rad`. Here, `cutoff` refers to the fraction cutoff of the distribution (e.g. `cutoff=0.9999` means taking only 99.99% of the lognormal distribution). Moreover, `gsigma` and `mode` are the lognormal parameters of the distribution, referring to the geometric standard deviation and mode (geometric mean) respectively. We use the `scipy.stats.lognorm` to construct the distribution in the `pre_discretize` method below.\n",
+    "\n",
+    "- [`particula.util.cutoff_radius`](./utilities/radius_cutoff.ipynb)\n",
+    "\n",
+    "Then, the `spacing` is used to create a vector of radii with `nbins` entries. The `spacing` attribute is a `string` type and for now, it can only be `\"linspace\"` or `\"logspace\"`: using the `numpy.linspace` or `numpy.logspace` functions, respectively, to construct the vector.\n",
+    "\n",
+    "Finally, the `pre_radius` method returns a radius vector with units of meter.\n",
+    "\n",
+    "### `ParticleDistribution.pre_discretize()`\n",
+    "\n",
+    "The `pre_discretize` method uses the result of the `pre_radius()` method above, `disttype`, `gsigma`, and `mode` attributes to produce a probability density function distribution based on the `scipy.stats.lognorm` (lognormal) function. This is done via the `distribution_discretization` utility.\n",
+    "\n",
+    "- [`particula.util.distribution_discretization`](./utilities/distribution_discretization.ipynb)\n",
+    "\n",
+    "### `ParticleDistribution.pre_distribution()`\n",
+    "\n",
+    "The `pre_distribution` method simply constructs the distribution multiplying the product of `pre_discretize()` by `nparticles` and dividing by `volume`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "resulting radius from 99.99% cutoff is  4.1972292396604054e-08 meter\n",
+      "resulting radius from 99% cutoff is  5.628288472608393e-08 meter\n"
+     ]
+    }
+   ],
+   "source": [
+    "from particula.particle import ParticleDistribution\n",
+    "PDcutoff1 = ParticleDistribution()\n",
+    "PDcutoff2 = ParticleDistribution(\n",
+    "    cutoff=.99,\n",
+    ")\n",
+    "\n",
+    "print(\"Starting radius from 99.99% cutoff is \", PDcutoff1.pre_radius().min())\n",
+    "print(\"Starting radius from 99% cutoff is \", PDcutoff2.pre_radius().min())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "First few radii from linspace spacing are  [4.1972292396604054e-08 4.216876899517281e-08 4.236524559374157e-08 4.256172219231033e-08 4.275819879087909e-08 4.295467538944785e-08] meter\n",
+      "First few radii from logspace spacing are  [4.1972292396604034e-08 4.204530615154216e-08 4.211844691904267e-08 4.2191714920053024e-08 4.2265110375904696e-08 4.2338633508314515e-08] meter\n"
+     ]
+    }
+   ],
+   "source": [
+    "from particula.particle import ParticleDistribution\n",
+    "PDspacing1 = ParticleDistribution()\n",
+    "PDspacing2 = ParticleDistribution(\n",
+    "    spacing=\"logspace\",\n",
+    ")\n",
+    "\n",
+    "print(\"First few radii from linspace spacing are \", PDspacing1.pre_radius()[:6])\n",
+    "print(\"First few radii from logspace spacing are \", PDspacing2.pre_radius()[:6])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The units of the distribution (density units):  1 / meter ** 4\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"The units of the distribution (density units): \", PDspacing1.pre_distribution().u)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The `ParticleInstances` inherits from the `ParticleDistribution` class, with the following added attributes and methods:\n",
+    "\n",
+    "## `ParticleInstances` attributes\n",
+    "\n",
+    "| attribute         | unit        | default value\n",
+    "| ---------         | ----        | -------------\n",
+    "| `particle_radius` | m           | `None` or `ParticleDistribution.pre_radius()`\n",
+    "| `particle_number` |             | `1` or `ParticleDistribution.nparticles`\n",
+    "| `particle_density`| kg / m^3    | `1e3`\n",
+    "| `shape_factor`    |             | `1`\n",
+    "| `volume_void`     |             | `0`\n",
+    "| `particle_charge` |             | `0`\n",
+    "\n",
+    "We note that the `particle_radius` attribute defaults to `ParticleDistribution.pre_radius()` if it is not given explicitly. Therefore, one could either provide a one or more radii via `particle_radius` or provide the parameters for a distribution as described above. The `particle_number` attribute defaults to `ParticleDistribution.nparticles` if the `particle_radius` attribute is not given explicitly; otherwise, it is set to `1` by default, but the user could provide a different value, for example, `particle_radius=[1e-9, 2e-9]` coupled with `particle_number=[1, 2]` would mean one particle of radius 1e-9 and two particles of radius 2e-9.\n",
+    "\n",
+    "In any event, the attributes here have higher precedence than the attributes in `ParticleDistribution`. Below, we reaffirm the `particle_distribution` as well.\n",
+    "\n",
+    "## `ParticleInstances` methods\n",
+    "\n",
+    "### `ParticleInstances.particle_distribution()`\n",
+    "\n",
+    "The `particle_distribution` method either returns the `ParticleDistribution.pre_distribution()` if the `particle_radius` attribute is not given explicitly, or it constructs the distribution dividing `particle_number` by `particle_radius` and dividing by `volume`.\n",
+    "\n",
+    "Note: the idea of distribution density necessitates normalizing by the variable (in our case, it is the radius) and here we divide by radius to get the unit of 1 / m^3 / m (i.e. number concentration density). \n",
+    "\n",
+    "### `ParticleInstances.particle_mass()`\n",
+    "\n",
+    "The `particle_mass` method returns the mass of the particle by using the `particle_radius`, `particle_density`, `shape_factor`, and `volume_void` attributes.\n",
+    "\n",
+    "- [`particula.util.particle_mass`](./utilities/particle_mass.ipynb)\n",
+    "\n",
+    "### `ParticleInstances.knudsen_number()`\n",
+    "\n",
+    "The `knudsen_number` method returns the knudsen number of the particle by using the `particle_radius` attribute as well as the `mean_free_path()` method.\n",
+    "\n",
+    "- [`knudsen_number`](./utilities/knudsen_number.ipynb)\n",
+    "\n",
+    "### `ParticleInstances.slip_correction_factor()`\n",
+    "\n",
+    "The `slip_correction_factor` method returns the slip correction factor of the particle by using the `particle_radius` attribute as well as the `knudsen_number()` method. \n",
+    "\n",
+    "- [`particula.util.slip_correction`](./utilities/slip_correction.ipynb)\n",
+    "\n",
+    "### `ParticleInstances.friction_factor()`\n",
+    "\n",
+    "The `friction_factor` method returns the friction factor of the particle by using the `particle_radius` attribute as well as the `dynamic_viscosity()` and `slip_correction_factor()` methods.\n",
+    "\n",
+    "- [`particula.util.friction_factor`](./utilities/friction_factor.ipynb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The units of the 'continuous' distribution (density units):  1 / meter ** 4\n",
+      "The units of the 'discrete' distribution (density units):  1 / meter ** 4\n",
+      "First few points of continuous:  [2200235960693703.8 2375247794883328.5] / meter ** 4\n",
+      "First few points of discrete:  [999999999999999.9 999999999999999.9] / meter ** 4\n"
+     ]
+    }
+   ],
+   "source": [
+    "from particula.particle import ParticleInstances\n",
+    "PD_dist = ParticleInstances()\n",
+    "PD_disc = ParticleInstances(\n",
+    "    particle_radius=[1e-9, 2e-9],\n",
+    "    particle_number=[1, 2]\n",
+    ")\n",
+    "\n",
+    "print(\"The units of the 'continuous' distribution (density units): \", PD_dist.particle_distribution().u)\n",
+    "print(\"The units of the 'discrete' distribution (density units): \", PD_disc.particle_distribution().u)\n",
+    "print(\"First few points of continuous: \", PD_dist.particle_distribution()[:2])\n",
+    "print(\"First few points of discrete: \", PD_disc.particle_distribution()[:2])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Particle mass:  [4.188790204786392e-24 3.3510321638291136e-23] kilogram\n",
+      "Friction factor:  [3.127639189424173e-15 1.2446393807134826e-14] kilogram / second\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"Particle mass: \", PD_disc.particle_mass())\n",
+    "print(\"Friction factor: \", PD_disc.friction_factor())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The `Particle` inherits from the `ParticleInstances` class, with the following added attributes and methods:\n",
+    "\n",
+    "\n",
+    "## The `Particle` attributes\n",
+    "\n",
+    "| attribute                   | unit               | default value\n",
+    "| ---------                   | ----               | -------------\n",
+    "| `elementary_charge_value`   | C                  | `constants.ELEMENTARY_CHARGE_VALUE`\n",
+    "| `electric_permittivity`     | F / m              | `constants.ELECTRIC_PERMITTIVITY`\n",
+    "| `boltzmann_constant`        | kg * m^2 / K / s^2 | `constants.BOLTZMANN_CONSTANT`\n",
+    "| `coagulation_approximation` |                    | `\"hardsphere\"`\n",
+    "\n",
+    "## The `Particle` methods\n",
+    "\n",
+    "The following methods are available for the `Particle` class:\n",
+    "\n",
+    "- `Particle._coag_prep()`\n",
+    "- `Particle.reduced_mass()`\n",
+    "- `Particle.reduced_friction_factor()`\n",
+    "- `Particle.coulomb_potential_ratio()`\n",
+    "- `Particle.coulomb_enhancement_kinetic_limit()`\n",
+    "- `Particle.coulomb_enhancement_continuum_limit()`\n",
+    "- `Particle.diffusive_knudsen_number()`\n",
+    "- `Particle.dimensionless_coagulation()`\n",
+    "- `Particle.coagulation()`\n",
+    "\n",
+    "They all rely on one underlying utility: the class `DimensionlessCoagulation` from `dimensionless_coagulation`, which is documented in the [`particula.util.dimensionless_coagulation`](./utilities/dimensionless_coagulation.ipynb) notebook.\n",
+    "\n",
+    "All these added methods rely on previously defined attributes and methods to construct particle--particle interaction (e.g. coagulation). Thus, each method takes an input argument `particle` which is an instance of the `Particle` class. If not explicitly provided, the `particle` argument defaults to `self` (itself)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.particle import Particle\n",
+    "\n",
+    "two_particles = Particle(\n",
+    "    particle_radius=[1e-9, 2e-9],\n",
+    "    particle_number=[1, 1]\n",
+    ")\n",
+    "\n",
+    "another_particle = Particle(particle_radius=1e-8)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table><tbody><tr><th>Magnitude</th><td style='text-align:left;'><pre>[[8.835482748391875e-16 1.4836836108384949e-15]<br> [1.4836836108384949e-15 1.235668665276733e-15]]</pre></td></tr><tr><th>Units</th><td style='text-align:left;'>meter<sup>3</sup>/second</td></tr></tbody></table>"
+      ],
+      "text/latex": [
+       "$\\begin{pmatrix}8.835482748391875\\times 10^{-16} & 1.4836836108384949\\times 10^{-15}\\\\ \n",
+       "1.4836836108384949\\times 10^{-15} & 1.235668665276733\\times 10^{-15}\\end{pmatrix}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$"
+      ],
+      "text/plain": [
+       "array([[8.83548275e-16, 1.48368361e-15],\n",
+       "       [1.48368361e-15, 1.23566867e-15]]) <Unit('meter ** 3 / second')>"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "two_particles.coagulation()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table><tbody><tr><th>Magnitude</th><td style='text-align:left;'><pre>[[2.3065250186958553e-15]]</pre></td></tr><tr><th>Units</th><td style='text-align:left;'>meter<sup>3</sup>/second</td></tr></tbody></table>"
+      ],
+      "text/latex": [
+       "$\\begin{pmatrix}2.3065250186958553\\times 10^{-15}\\end{pmatrix}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$"
+      ],
+      "text/plain": [
+       "array([[2.30652502e-15]]) <Unit('meter ** 3 / second')>"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "another_particle.coagulation()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table><tbody><tr><th>Magnitude</th><td style='text-align:left;'><pre>[[2.3065250186958553e-15]]</pre></td></tr><tr><th>Units</th><td style='text-align:left;'>meter<sup>3</sup>/second</td></tr></tbody></table>"
+      ],
+      "text/latex": [
+       "$\\begin{pmatrix}2.3065250186958553\\times 10^{-15}\\end{pmatrix}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$"
+      ],
+      "text/plain": [
+       "array([[2.30652502e-15]]) <Unit('meter ** 3 / second')>"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "another_particle.coagulation(another_particle)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table><tbody><tr><th>Magnitude</th><td style='text-align:left;'><pre>[[1.8143554043998508e-14]<br> [7.479664416578196e-15]]</pre></td></tr><tr><th>Units</th><td style='text-align:left;'>meter<sup>3</sup>/second</td></tr></tbody></table>"
+      ],
+      "text/latex": [
+       "$\\begin{pmatrix}1.8143554043998508\\times 10^{-14}\\\\ \n",
+       "7.479664416578196\\times 10^{-15}\\end{pmatrix}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$"
+      ],
+      "text/plain": [
+       "array([[1.81435540e-14],\n",
+       "       [7.47966442e-15]]) <Unit('meter ** 3 / second')>"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "two_particles.coagulation(another_particle)"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.10.4 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.4"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/dimensionless_coagulation.ipynb b/docs/documentation/utilities/dimensionless_coagulation.ipynb
new file mode 100644
index 000000000..201782ab7
--- /dev/null
+++ b/docs/documentation/utilities/dimensionless_coagulation.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `dimensionless_coagulation`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import dimensionless_coagulation\n",
+    "help(dimensionless_coagulation)\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/distribution_discretization.ipynb b/docs/documentation/utilities/distribution_discretization.ipynb
new file mode 100644
index 000000000..20746b43d
--- /dev/null
+++ b/docs/documentation/utilities/distribution_discretization.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `distribution_discretization`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import distribution_discretization\n",
+    "help(distribution_discretization)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/dynamic_viscosity.ipynb b/docs/documentation/utilities/dynamic_viscosity.ipynb
new file mode 100644
index 000000000..296726e8b
--- /dev/null
+++ b/docs/documentation/utilities/dynamic_viscosity.ipynb
@@ -0,0 +1,81 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `dynamic_viscosity`\n",
+    "\n",
+    "The dynamic viscosity is a property of the fluid, defining the resistance of the fluid to its own movement. The dynamic viscosity is calculated using the Sutherland formula ([reference](https://resources.wolframcloud.com/FormulaRepository/resources/Sutherlands-Formula)). The function can be found and is documented in `util.dynamic_viscosity.py`. It takes inputs of `temperature`, `reference_viscosity`, `reference_temperature`, and `sutherland_constant`. It returns a value for the dynamic viscosity at those variables. At default conditions (298.15 K and 101325 Pa), the dynamic viscosity is approximately 1.84e-5 kg/m/s. The Sutherland formula is\n",
+    "\n",
+    "$$\n",
+    "\\mu = \\frac{\\mu_{0}\\, (T/T_{0})^{3/2}\\, (T_{0} + C)}{C + T}\n",
+    "$$\n",
+    "\n",
+    "where $\\mu$ is the dynamic viscosity, $\\mu_{0}$ is the reference dynamic viscosity, $T$ is temperature, $T_{0}$ is the reference temperature, and $C$ is the Sutherland constant."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "1.8371493734583912×10<sup>-5</sup> kilogram/(meter second)"
+      ],
+      "text/latex": [
+       "$1.8371493734583912\\times 10^{-5}\\ \\frac{\\mathrm{kilogram}}{\\left(\\mathrm{meter} \\cdot \\mathrm{second}\\right)}$"
+      ],
+      "text/plain": [
+       "1.8371493734583912e-05 <Unit('kilogram / meter / second')>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from particula.environment import Environment\n",
+    "Environment().dynamic_viscosity() # will produce approx 1.84e-5 kg/m/s"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import dynamic_viscosity\n",
+    "help(dynamic_viscosity)"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.10.4 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.4"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/friction_factor.ipynb b/docs/documentation/utilities/friction_factor.ipynb
new file mode 100644
index 000000000..d0d34a743
--- /dev/null
+++ b/docs/documentation/utilities/friction_factor.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `friction_factor`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import friction_factor\n",
+    "help(friction_factor)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/knudsen_number.ipynb b/docs/documentation/utilities/knudsen_number.ipynb
new file mode 100644
index 000000000..f67a92dd3
--- /dev/null
+++ b/docs/documentation/utilities/knudsen_number.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `knudsen_number`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import knudsen_number\n",
+    "help(knudsen_number)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/mean_free_path.ipynb b/docs/documentation/utilities/mean_free_path.ipynb
new file mode 100644
index 000000000..3286841e3
--- /dev/null
+++ b/docs/documentation/utilities/mean_free_path.ipynb
@@ -0,0 +1,72 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `mean_free_path`\n",
+    "\n",
+    "The mean free path is the average distance of a molecule between collisions with other molecules present in the medium. We use the kinetic theory of gases to calculate the mean free path in an ideal gas as\n",
+    "\n",
+    "$$\n",
+    "\\lambda = \\frac{2 \\mu / p}{(8 \\, \\mathrm{MW} / (\\pi R T))^{1/2}} \n",
+    "$$\n",
+    "\n",
+    "where $\\lambda$ is the mean free path, $\\mu$ is the dynamic viscosity, $p$ is the pressure, $\\mathrm{MW}$ is the molecular weight, $R$ is the gas constant, $T$ is the temperature. As noted above, the user can provide an explicit value for $\\mu$ or it can be calculated using the above formula (that is, the user can provide the inputs to the above formula for $\\mu$). At default conditions, $\\lambda$ is about 66.5 nm."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "mean free path is  6.647984982685411e-08 meter\n"
+     ]
+    }
+   ],
+   "source": [
+    "from particula.environment import Environment\n",
+    "print(\"mean free path is \", Environment().mean_free_path()) # will produce approx 66.5 nm"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import mean_free_path\n",
+    "help(mean_free_path)"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.10.4 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.4"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/particle_mass.ipynb b/docs/documentation/utilities/particle_mass.ipynb
new file mode 100644
index 000000000..030830dac
--- /dev/null
+++ b/docs/documentation/utilities/particle_mass.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `particle_mass`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import particle_mass\n",
+    "help(particle_mass)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/radius_cutoff.ipynb b/docs/documentation/utilities/radius_cutoff.ipynb
new file mode 100644
index 000000000..b79bd7104
--- /dev/null
+++ b/docs/documentation/utilities/radius_cutoff.ipynb
@@ -0,0 +1,30 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `radius_cutoff`\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import radius_cutoff\n",
+    "help(radius_cutoff)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/utilities/slip_correction.ipynb b/docs/documentation/utilities/slip_correction.ipynb
new file mode 100644
index 000000000..b47dc4593
--- /dev/null
+++ b/docs/documentation/utilities/slip_correction.ipynb
@@ -0,0 +1,29 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# `slip_correction`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from particula.util import slip_correction\n",
+    "help(slip_correction)"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/documentation/vapor.ipynb b/docs/documentation/vapor.ipynb
index 8051151a2..2383d54cd 100644
--- a/docs/documentation/vapor.ipynb
+++ b/docs/documentation/vapor.ipynb
@@ -4,19 +4,19 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# The `Vapor` class"
+    "# The `Vapor` Class"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "The `Vapor` class links the `Environment` class with the `Particle` class by defining condensing vapor that are precursors to particles. The `Vapor` class is defined in `paritcula/vapor.py`. It inherits everything from the `Environment` class, including attributes and methods. It can be imported as,"
+    "The `Vapor` class links the `Environment` class with the `Particle` class by defining condensing vapor that are precursors to particles. The `Vapor` class is defined in `particula/vapor.py`. It inherits everything from the `Environment` class, including attributes and methods. It can be imported as,"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -38,11 +38,11 @@
     "\n",
     "| attribute             | unit     | default\n",
     "| ---------             | ----     | -------\n",
-    "| `vapor_radius`        | m        | 1.6e-9\n",
-    "| `vapor_density`       | kg / m^3 | 1400\n",
-    "| `vapor_concentration` | kg / m^3 | 1e-5\n",
-    "| `vapor_attachment`    |          | 1\n",
-    "| `vapor_molec_wt`      | kg / mol | 0.2\n",
+    "| `vapor_radius`        | m        | `1.6e-9`\n",
+    "| `vapor_density`       | kg / m^3 | `1400`\n",
+    "| `vapor_concentration` | kg / m^3 | `1e-5`\n",
+    "| `vapor_attachment`    |          | `1`\n",
+    "| `vapor_molec_wt`      | kg / mol | `0.2`\n",
     "\n",
     "For example, `Vapor(vapor_radius=1e-9)` initiates the class with vapor radius of 1 nm with all other default attributes. Additionally, `Vapor(vapor_radius=1e-9, temperature=290)` will initiate the class with 290 K and 1 nm, in addition to all other attributes. Above, `vapor_radius` and `vapor_density` refer to the radius of the condensing vapor and its density, respectively. The `vapor_concentration` attribute defines the driving force of condensation (defined below). The `vapor_attachment` coefficient is the sticking coefficient between a vapor and a particle and it is dimensionless; `vapor_molec_wt` is the molecular weight of the condensing vapor. \n",
     "\n",
@@ -51,14 +51,24 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "temperature is  300 kelvin\n",
+      "pressure is  101325 kilogram / meter / second ** 2\n",
+      "vapor radius is  1.6e-09 meter\n"
+     ]
+    }
+   ],
    "source": [
     "from particula import u\n",
     "from particula.vapor import Vapor\n",
     "\n",
-    "VapOne = Vapo(temperature=300) \n",
+    "VapOne = Vapor(temperature=300) \n",
     "print(\"temperature is \", VapOne.temperature) # will print 300 K\n",
     "print(\"pressure is \", VapOne.pressure) # will print 101325 Pa (kg/m/s^2)\n",
     "print(\"vapor radius is \", VapOne.vapor_radius)  # will print 1.6 nm"
@@ -84,8 +94,25 @@
   }
  ],
  "metadata": {
+  "interpreter": {
+   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.10.4 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
   "language_info": {
-   "name": "python"
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.4"
   },
   "orig_nbformat": 4
  },
diff --git a/docs/tutorials/001_ParticleClass.ipynb b/docs/tutorials/001_ParticleClass.ipynb
deleted file mode 100644
index 3393c1a8a..000000000
--- a/docs/tutorials/001_ParticleClass.ipynb
+++ /dev/null
@@ -1,1228 +0,0 @@
-{
-  "cells": [
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "mYSYN2FTC7JX"
-      },
-      "source": [
-        "# Particle Class"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "B9ip8rJNBgZF"
-      },
-      "source": [
-        "First, install `particula` from PyPI using `!pip install -U particula` or `%pip install -U particula`. The `!` are `%` symbols are so-called magic signs prefixing \"magic functions\". In this case, the magic function is `%pip` --- which is one way to install Python packages from the PyPI (the Python Package Index). The `-U` is to instruct `pip` to update particula to the latest version."
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 1,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/"
-        },
-        "id": "vPT-i9Qu-QU8",
-        "outputId": "bbe6b74c-23d8-4c71-8e61-fd96ba848f03"
-      },
-      "outputs": [
-        {
-          "output_type": "stream",
-          "name": "stdout",
-          "text": [
-            "Collecting particula\n",
-            "  Downloading particula-0.0.3-py3-none-any.whl (13 kB)\n",
-            "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from particula) (1.19.5)\n",
-            "Collecting pint\n",
-            "  Downloading Pint-0.18-py2.py3-none-any.whl (209 kB)\n",
-            "\u001b[?25l\r\u001b[K     |█▋                              | 10 kB 23.6 MB/s eta 0:00:01\r\u001b[K     |███▏                            | 20 kB 24.5 MB/s eta 0:00:01\r\u001b[K     |████▊                           | 30 kB 28.5 MB/s eta 0:00:01\r\u001b[K     |██████▎                         | 40 kB 32.1 MB/s eta 0:00:01\r\u001b[K     |███████▉                        | 51 kB 33.9 MB/s eta 0:00:01\r\u001b[K     |█████████▍                      | 61 kB 37.7 MB/s eta 0:00:01\r\u001b[K     |███████████                     | 71 kB 33.7 MB/s eta 0:00:01\r\u001b[K     |████████████▌                   | 81 kB 34.3 MB/s eta 0:00:01\r\u001b[K     |██████████████                  | 92 kB 33.8 MB/s eta 0:00:01\r\u001b[K     |███████████████▋                | 102 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |█████████████████▏              | 112 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |██████████████████▊             | 122 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |████████████████████▎           | 133 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |█████████████████████▉          | 143 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |███████████████████████▍        | 153 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |█████████████████████████       | 163 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |██████████████████████████▋     | 174 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |████████████████████████████▏   | 184 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |█████████████████████████████▊  | 194 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |███████████████████████████████▎| 204 kB 32.8 MB/s eta 0:00:01\r\u001b[K     |████████████████████████████████| 209 kB 32.8 MB/s \n",
-            "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from pint->particula) (4.8.2)\n",
-            "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from pint->particula) (21.3)\n",
-            "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->pint->particula) (3.10.0.2)\n",
-            "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->pint->particula) (3.6.0)\n",
-            "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->pint->particula) (3.0.6)\n",
-            "Installing collected packages: pint, particula\n",
-            "Successfully installed particula-0.0.3 pint-0.18\n"
-          ]
-        }
-      ],
-      "source": [
-        "%pip install -U particula"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "EoTypuRQCsfA"
-      },
-      "source": [
-        "After installing `particula`, we can import it into our workspace with `import particula`. Let's check the version with `.__version__` and let's call `help` on the overall package to see what we have. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 2,
-      "metadata": {
-        "id": "U5UTLkYi-R_2"
-      },
-      "outputs": [],
-      "source": [
-        "import particula"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 3,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "7wnlcZmb-YVJ",
-        "outputId": "d81b6731-786f-4748-e05b-a6dd8daa7f51"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "application/vnd.google.colaboratory.intrinsic+json": {
-              "type": "string"
-            },
-            "text/plain": [
-              "'0.0.3'"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 3
-        }
-      ],
-      "source": [
-        "particula.__version__"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 4,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/"
-        },
-        "id": "4wp25bbh-bw5",
-        "outputId": "1a1821f7-5613-44c0-c7d4-9210443543e9"
-      },
-      "outputs": [
-        {
-          "output_type": "stream",
-          "name": "stdout",
-          "text": [
-            "Help on package particula:\n",
-            "\n",
-            "NAME\n",
-            "    particula - a simple, fast, and powerful particle simulator.\n",
-            "\n",
-            "DESCRIPTION\n",
-            "    particula is a simple, fast, and powerful particle simulator,\n",
-            "    or at least two of the three, we hope. It is a simple particle\n",
-            "    system that is designed to be easy to use and easy to extend.\n",
-            "    The goal is to have a robust aerosol (gas phase + particle phase)\n",
-            "    simulation system that can be used to answer scientific questions\n",
-            "    that arise for experiments and research discussions.\n",
-            "    \n",
-            "    The main features of particula are:\n",
-            "    ...\n",
-            "    \n",
-            "    More details to follow.\n",
-            "\n",
-            "PACKAGE CONTENTS\n",
-            "    aerosol_dynamics (package)\n",
-            "\n",
-            "DATA\n",
-            "    u = <pint.registry.UnitRegistry object>\n",
-            "\n",
-            "VERSION\n",
-            "    0.0.3\n",
-            "\n",
-            "FILE\n",
-            "    /usr/local/lib/python3.7/dist-packages/particula/__init__.py\n",
-            "\n",
-            "\n"
-          ]
-        }
-      ],
-      "source": [
-        "help(particula)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "wXPNsoC7DFmv"
-      },
-      "source": [
-        "The above two code cells show that we have the prerelease version `0.0.3` (our latest as of writing this). We still are in the process of writing more thorough documentation, and so a help call on `particula` yields a minimal description. However, we get a hint about what else is inside this package, `aerosol_dynamics` package/module. We will check this now.\n",
-        "\n",
-        "We also see `u = <pint.registry.UnitRegistry object>` under `DATA`: This is our unit registry which ensures proper unit tracking throughout each entire instance of the package. "
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "zrNnQDp0C-N2"
-      },
-      "source": [
-        "## `aerosol_dynamics` module"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "podJg5bWEg0Q"
-      },
-      "source": [
-        "We can import `aerosol_dynamics` either via \n",
-        "\n",
-        "```python\n",
-        "from particula import aerosol_dynamics\n",
-        "```\n",
-        "\n",
-        "or\n",
-        "\n",
-        "```python\n",
-        "import particula.aerosol_dynamics\n",
-        "```\n",
-        "\n",
-        "to check it out. We will call help again to see what we have. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 5,
-      "metadata": {
-        "id": "wAAzjh6A-hVN"
-      },
-      "outputs": [],
-      "source": [
-        "from particula import aerosol_dynamics"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 6,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/"
-        },
-        "id": "8QtMsgOz-uvK",
-        "outputId": "d95cc9f8-1010-4371-ebb2-cee195c5d0f4"
-      },
-      "outputs": [
-        {
-          "output_type": "stream",
-          "name": "stdout",
-          "text": [
-            "Help on package particula.aerosol_dynamics in particula:\n",
-            "\n",
-            "NAME\n",
-            "    particula.aerosol_dynamics - module to perform calculations related to aerosol dynamics.\n",
-            "\n",
-            "DESCRIPTION\n",
-            "    This module contains functions to perform calculations related\n",
-            "    to aerosol dynamics. It inherits the unit registry, u, from\n",
-            "    particula. The pacakge contents below are callablle. For example,\n",
-            "    the particle module is callable as:\n",
-            "    \n",
-            "    >>> from particula.aerosol_dynamics import particle\n",
-            "    \n",
-            "    ...\n",
-            "    \n",
-            "    More details to follow.\n",
-            "\n",
-            "PACKAGE CONTENTS\n",
-            "    environment\n",
-            "    parcel\n",
-            "    particle\n",
-            "    physical_parameters\n",
-            "    tests (package)\n",
-            "\n",
-            "FILE\n",
-            "    /usr/local/lib/python3.7/dist-packages/particula/aerosol_dynamics/__init__.py\n",
-            "\n",
-            "\n"
-          ]
-        }
-      ],
-      "source": [
-        "help(aerosol_dynamics)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "K7twy8pqE7-S"
-      },
-      "source": [
-        "Now! We have some package contents that look promising. We will only check out `particle` in this case. Again, import it and call help on it."
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 7,
-      "metadata": {
-        "id": "G8u_QMMT-sfx"
-      },
-      "outputs": [],
-      "source": [
-        "from particula.aerosol_dynamics import particle"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 8,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/"
-        },
-        "id": "1_yFPZr9--_L",
-        "outputId": "a2d0ed25-1ddf-4a97-b31e-5a9db46fb761"
-      },
-      "outputs": [
-        {
-          "output_type": "stream",
-          "name": "stdout",
-          "text": [
-            "Help on module particula.aerosol_dynamics.particle in particula.aerosol_dynamics:\n",
-            "\n",
-            "NAME\n",
-            "    particula.aerosol_dynamics.particle - to instantiate particles and calculate their properties.\n",
-            "\n",
-            "DESCRIPTION\n",
-            "    This module contains the Particle class, which is used to\n",
-            "    instantiate the particles and calculate their properties.\n",
-            "    Particles are introduced and defined by calling Particle\n",
-            "    class, for example:\n",
-            "    \n",
-            "    >>> from particula import Particle\n",
-            "    >>> p1 = Particle(name='my_particle', radius=1e-9, density=1e3, charge=1)\n",
-            "    \n",
-            "    Then, it is possible to return the properties of the particle p1:\n",
-            "    \n",
-            "    >>> p1.mass()\n",
-            "    \n",
-            "    The environment is defined by the following parameters:\n",
-            "    >>> from particula.aerosol_dynamics import environment\n",
-            "    >>> env = environment.Environment(temperature=300, pressure=1e5)\n",
-            "    \n",
-            "    If another particle is introduced, it is possible to calculate\n",
-            "    the binary coagulation coefficient:\n",
-            "    \n",
-            "    >>> p2 = Particle(name='my_particle2', radius=1e-9, density=1e3, charge=1)\n",
-            "    >>> p1.dimensioned_coagulation_kernel(p2, env)\n",
-            "    \n",
-            "    For more details, see below. More information to follow.\n",
-            "\n",
-            "CLASSES\n",
-            "    builtins.object\n",
-            "        Particle\n",
-            "    \n",
-            "    class Particle(builtins.object)\n",
-            "     |  Particle(name: str, radius, density, charge)\n",
-            "     |  \n",
-            "     |  Class to instantiate particles and calculate their properties.\n",
-            "     |  \n",
-            "     |  This class represents the underlying framework for both\n",
-            "     |  particle--particle and gas--particle interactions. See detailed\n",
-            "     |  methods and functions below.\n",
-            "     |  \n",
-            "     |  Attributes:\n",
-            "     |  \n",
-            "     |      name    (str)   [no units]\n",
-            "     |      radius  (float) [m]\n",
-            "     |      density (float) [kg/m**3]\n",
-            "     |      charge  (int)   [dimensionless]\n",
-            "     |      mass    (float) [kg]\n",
-            "     |  \n",
-            "     |  Methods defined here:\n",
-            "     |  \n",
-            "     |  __init__(self, name: str, radius, density, charge)\n",
-            "     |      Constructs particle objects.\n",
-            "     |      \n",
-            "     |      Parameters:\n",
-            "     |      \n",
-            "     |          name    (str)   [no units]\n",
-            "     |          radius  (float) [m]\n",
-            "     |          density (float) [kg/m**3]\n",
-            "     |          charge  (int)   [dimensionless]\n",
-            "     |  \n",
-            "     |  charge(self) -> int\n",
-            "     |      Returns number of charges on particle.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  collision_kernel_continuum_limit(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Continuum limit of collision kernel.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  collision_kernel_kinetic_limit(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Kinetic limit of collision kernel.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  coulomb_enhancement_continuum_limit(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Continuum limit of Coulomb enhancement for particle--particle coagulation.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  coulomb_enhancement_kinetic_limit(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Kinetic limit of Coulomb enhancement for particle--particle cooagulation.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  coulomb_potential_ratio(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Calculates the Coulomb potential ratio.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  density(self) -> int\n",
-            "     |      Returns density of particle.\n",
-            "     |      \n",
-            "     |      Checks units: [kg/m**3]\n",
-            "     |  \n",
-            "     |  diffusive_knudsen_number(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Diffusive Knudsen number.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |      \n",
-            "     |      The *diffusive* Knudsen number is different from Knudsen number.\n",
-            "     |      Ratio of:\n",
-            "     |      \n",
-            "     |          - numerator: mean persistence of one particle\n",
-            "     |          - denominator: effective length scale of\n",
-            "     |              particle--particle Coulombic interaction\n",
-            "     |  \n",
-            "     |  dimensioned_coagulation_kernel(self, other, environment: particula.aerosol_dynamics.environment.Environment, authors: str = 'cg2019') -> float\n",
-            "     |      Dimensioned particle--particle coagulation kernel.\n",
-            "     |      \n",
-            "     |      Checks units: [m**3/s]\n",
-            "     |      \n",
-            "     |      Paramaters:\n",
-            "     |      \n",
-            "     |          self:           particle 1\n",
-            "     |          other:          particle 2\n",
-            "     |          environment:    environment conditions\n",
-            "     |          authors:        authors of the parameterization\n",
-            "     |              - gh2012    https://doi.org/10.1103/PhysRevE.78.046402\n",
-            "     |              - cg2020    https://doi.org/XXXXXXXXXXXXXXXXXXXXXXXXXX\n",
-            "     |              - hard_sphere (from above)\n",
-            "     |              (default: cg2019)\n",
-            "     |  \n",
-            "     |  dimensionless_coagulation_kernel_hard_sphere(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Dimensionless particle--particle coagulation kernel.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |  \n",
-            "     |  dimensionless_coagulation_kernel_parameterized(self, other, environment: particula.aerosol_dynamics.environment.Environment, authors: str = 'cg2019') -> float\n",
-            "     |      Dimensionless particle--particle coagulation kernel.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |      \n",
-            "     |      Paramaters:\n",
-            "     |      \n",
-            "     |          self:           particle 1\n",
-            "     |          other:          particle 2\n",
-            "     |          environment:    environment conditions\n",
-            "     |          authors:        authors of the parameterization\n",
-            "     |              - gh2012    doi.org:10.1103/PhysRevE.78.046402\n",
-            "     |              - cg2019    doi:10.1080/02786826.2019.1614522\n",
-            "     |              - hard_sphere\n",
-            "     |              (default: cg2019)\n",
-            "     |  \n",
-            "     |  friction_factor(self, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Returns a particle's friction factor.\n",
-            "     |      \n",
-            "     |      Checks units: [N*s/m]\n",
-            "     |      \n",
-            "     |      Property of the particle's size and surrounding medium.\n",
-            "     |      Multiplying the friction factor by the fluid velocity\n",
-            "     |      yields the drag force on the particle.\n",
-            "     |  \n",
-            "     |  knudsen_number(self, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Returns particle's Knudsen number.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |      \n",
-            "     |      The Knudsen number reflects the relative length scales of\n",
-            "     |      the particle and the suspending fluid (air, water, etc.).\n",
-            "     |      This is calculated by the mean free path of the medium\n",
-            "     |      divided by the particle radius.\n",
-            "     |  \n",
-            "     |  mass(self) -> float\n",
-            "     |      Returns mass of particle.\n",
-            "     |      \n",
-            "     |      Checks units: [kg]\n",
-            "     |  \n",
-            "     |  name(self) -> str\n",
-            "     |      Returns the name of particle.\n",
-            "     |  \n",
-            "     |  radius(self) -> float\n",
-            "     |      Returns radius of particle.\n",
-            "     |      \n",
-            "     |      Checks units: [m]\n",
-            "     |  \n",
-            "     |  reduced_friction_factor(self, other, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Returns the reduced friction factor between two particles.\n",
-            "     |      \n",
-            "     |      Checks units: [N*s/m]\n",
-            "     |      \n",
-            "     |      Similar to the reduced mass.\n",
-            "     |      The reduced friction factor allows a two-body problem\n",
-            "     |      to be solved as a one-body problem.\n",
-            "     |  \n",
-            "     |  reduced_mass(self, other) -> float\n",
-            "     |      Returns the reduced mass of two particles.\n",
-            "     |      \n",
-            "     |      Checks units: [kg]\n",
-            "     |      \n",
-            "     |      The reduced mass is an \"effective inertial\" mass.\n",
-            "     |      Allows a two-body problem to be solved as a one-body problem.\n",
-            "     |  \n",
-            "     |  slip_correction_factor(self, environment: particula.aerosol_dynamics.environment.Environment) -> float\n",
-            "     |      Returns particle's Cunningham slip correction factor.\n",
-            "     |      \n",
-            "     |      Checks units: [dimensionless]\n",
-            "     |      \n",
-            "     |      Dimensionless quantity accounting for non-continuum effects\n",
-            "     |      on small particles. It is a deviation from Stokes' Law.\n",
-            "     |      Stokes assumes a no-slip condition that is not correct at\n",
-            "     |      high Knudsen numbers. The slip correction factor is used to\n",
-            "     |      calculate the friction factor.\n",
-            "     |      \n",
-            "     |      See Eq 9.34 in Atmos. Chem. & Phys. (2016) for more informatiom.\n",
-            "     |  \n",
-            "     |  ----------------------------------------------------------------------\n",
-            "     |  Data descriptors defined here:\n",
-            "     |  \n",
-            "     |  __dict__\n",
-            "     |      dictionary for instance variables (if defined)\n",
-            "     |  \n",
-            "     |  __weakref__\n",
-            "     |      list of weak references to the object (if defined)\n",
-            "\n",
-            "DATA\n",
-            "    u = <pint.registry.UnitRegistry object>\n",
-            "\n",
-            "FILE\n",
-            "    /usr/local/lib/python3.7/dist-packages/particula/aerosol_dynamics/particle.py\n",
-            "\n",
-            "\n"
-          ]
-        }
-      ],
-      "source": [
-        "help(particle)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "3-mgI7yBFegi"
-      },
-      "source": [
-        "We see there is more documentation now. The `help` call lists a \"class\" called \"Particle\" and all its available \"methods\" (read: functions) alphabetically. For now, you can think of a class as a super-function (it is more than that). Note also, that classes follow `CamelCase` (hence, `Particle`) whereas methods/functions follow snake_case (hence, `reduced_mass`). We make a lot of use of unit registry (called `u`) to ensure all our calculations have proper units, even if dimensionless. Without further ado, let's look at an example."
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "B-dwE5_tGYpv"
-      },
-      "source": [
-        "## Calculating coagulation \n",
-        "\n",
-        "Let's define to particles, `particle_a` and `particle_b`."
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 9,
-      "metadata": {
-        "id": "2u7Lo1wb_Adx"
-      },
-      "outputs": [],
-      "source": [
-        "particle_a = particle.Particle(name='a', radius=1e-9, density=1e3, charge=0)"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 10,
-      "metadata": {
-        "id": "2jpUw274_ZA5"
-      },
-      "outputs": [],
-      "source": [
-        "particle_b = particle.Particle(name='b', radius=2e-9, density=1e3, charge=0)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "qeje43ycGo93"
-      },
-      "source": [
-        "Then, if we call the `radius` method of particle_a (as suffix), we get its radius printed with a unit. Alternatively, we can call the `radius` method from the class itself, not prefixed to a certain particle (same result)."
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 11,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "FMms9WdJ_Sca",
-        "outputId": "898bf4bd-60a8-46a5-a163-395ef1997870"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$1\\times 10^{-9}\\ \\mathrm{meter}$",
-            "text/html": [
-              "1×10<sup>-9</sup> meter"
-            ],
-            "text/plain": [
-              "1e-09 meter"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 11
-        }
-      ],
-      "source": [
-        "particle_a.radius()"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 12,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "zDPQ1em5G6kK",
-        "outputId": "137cec72-605b-44bb-87e9-89292b06c883"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$1\\times 10^{-9}\\ \\mathrm{meter}$",
-            "text/html": [
-              "1×10<sup>-9</sup> meter"
-            ],
-            "text/plain": [
-              "1e-09 meter"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 12
-        }
-      ],
-      "source": [
-        "particle.Particle.radius(particle_a)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "tQl8XvpLHBTk"
-      },
-      "source": [
-        "Same for the `mass` and `charge` methods. Note `charge` here is the number of charges. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 13,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "JLlT1gix_uCf",
-        "outputId": "377d0127-ff1b-421d-c5dd-e400eaaaaf90"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$3.3510321638291136\\times 10^{-23}\\ \\mathrm{kilogram}$",
-            "text/html": [
-              "3.3510321638291136×10<sup>-23</sup> kilogram"
-            ],
-            "text/plain": [
-              "3.3510321638291136e-23 kilogram"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 13
-        }
-      ],
-      "source": [
-        "particle_b.mass()"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 14,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 34
-        },
-        "id": "LbymGF8g_wXp",
-        "outputId": "e6287127-27d5-4b78-9185-12b6178099d8"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$0\\ dimensionless$",
-            "text/html": [
-              "0 dimensionless"
-            ],
-            "text/plain": [
-              "0 dimensionless"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 14
-        }
-      ],
-      "source": [
-        "particle_a.charge()"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "Bjp_PcNpHJHa"
-      },
-      "source": [
-        "We should also define the environment we are in. We will get that module and invoke with 300 K and 10,000 Pa. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 15,
-      "metadata": {
-        "id": "3QdNH5tY_Uwm"
-      },
-      "outputs": [],
-      "source": [
-        "from particula.aerosol_dynamics import environment"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 16,
-      "metadata": {
-        "id": "akifp3gw_g9O"
-      },
-      "outputs": [],
-      "source": [
-        "std_environment = environment.Environment(temperature=300, pressure=1e5)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "UlzbZwXVHXhl"
-      },
-      "source": [
-        "Now, we can calculate the Knudsen number of particle \"a\" in this \"standard\" environment. And the slip correction factor. And the friction factor. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 17,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 34
-        },
-        "id": "HAgIJr2T_qZg",
-        "outputId": "b7f05b61-aace-4409-9a6f-f8fd08d6cc27"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$67.8918099704083\\ dimensionless$",
-            "text/html": [
-              "67.8918099704083 dimensionless"
-            ],
-            "text/plain": [
-              "67.8918099704083 dimensionless"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 17
-        }
-      ],
-      "source": [
-        "particle_a.knudsen_number(std_environment)"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 18,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 34
-        },
-        "id": "XSNrw_6ZARM3",
-        "outputId": "e94af953-a536-47c3-f355-6b4cc2051dbe"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$113.060274442495\\ dimensionless$",
-            "text/html": [
-              "113.060274442495 dimensionless"
-            ],
-            "text/plain": [
-              "113.060274442495 dimensionless"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 18
-        }
-      ],
-      "source": [
-        "particle_a.slip_correction_factor(std_environment)"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 19,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "HK8bC6UBAVro",
-        "outputId": "4d259d19-1dfd-4b5b-a383-bfbdd530e80e"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$3.0775355689697488\\times 10^{-15}\\ \\frac{\\mathrm{kilogram}}{\\mathrm{second}}$",
-            "text/html": [
-              "3.0775355689697488×10<sup>-15</sup> kilogram/second"
-            ],
-            "text/plain": [
-              "3.0775355689697488e-15 kilogram/second"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 19
-        }
-      ],
-      "source": [
-        "particle_a.friction_factor(std_environment)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "6w_hMzlZHjWI"
-      },
-      "source": [
-        "Now, let's calculate the reduced mass of two particles, \"a\" and \"b\". Again, there are two ways to do this: by suffixing the method to a particle or by calling the method from the class --- they yield the same result. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 20,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "_PKC3LnwAcQ-",
-        "outputId": "1891b754-6ff7-4770-b323-553e011e9052"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$3.7233690709212374\\times 10^{-24}\\ \\mathrm{kilogram}$",
-            "text/html": [
-              "3.7233690709212374×10<sup>-24</sup> kilogram"
-            ],
-            "text/plain": [
-              "3.7233690709212374e-24 kilogram"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 20
-        }
-      ],
-      "source": [
-        "particle_a.reduced_mass(particle_b)"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 21,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "5OcaX-MzAntA",
-        "outputId": "cba83a1d-d5d5-44b0-be09-f4e36c0a8d9e"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$3.7233690709212374\\times 10^{-24}\\ \\mathrm{kilogram}$",
-            "text/html": [
-              "3.7233690709212374×10<sup>-24</sup> kilogram"
-            ],
-            "text/plain": [
-              "3.7233690709212374e-24 kilogram"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 21
-        }
-      ],
-      "source": [
-        "particle.Particle.reduced_mass(particle_a, particle_b)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "CkRfw2aUHxJ4"
-      },
-      "source": [
-        "Like the reduced mass, we can also look at the reduced friction. "
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 22,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "5k5DMlpXArBI",
-        "outputId": "7249e819-a025-4658-ede2-28f0f05dc029"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$2.4595460300833962\\times 10^{-15}\\ \\frac{\\mathrm{kilogram}}{\\mathrm{second}}$",
-            "text/html": [
-              "2.4595460300833962×10<sup>-15</sup> kilogram/second"
-            ],
-            "text/plain": [
-              "2.4595460300833962e-15 kilogram/second"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 22
-        }
-      ],
-      "source": [
-        "particle_a.reduced_friction_factor(particle_b, std_environment)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "metadata": {
-        "id": "_fhngrQaH1dM"
-      },
-      "source": [
-        "We can also calculate the coagulation rate coefficient between particles \"a\" and \"b\" in this environment. Note that we could have called this directly after defining \"a\" and \"b\"."
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 23,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 34
-        },
-        "id": "BNtlCy0DBByx",
-        "outputId": "07e52e8d-567b-411e-fe6a-6e45f6aadf06"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$83.4628646051075\\ dimensionless$",
-            "text/html": [
-              "83.4628646051075 dimensionless"
-            ],
-            "text/plain": [
-              "83.4628646051075 dimensionless"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 23
-        }
-      ],
-      "source": [
-        "particle.Particle.dimensionless_coagulation_kernel_hard_sphere(\n",
-        "    particle_a, particle_b, std_environment\n",
-        ")"
-      ]
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 24,
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 34
-        },
-        "id": "k1Ku87U5IdgE",
-        "outputId": "4a792e21-9177-4f8d-ac71-a88d76197edb"
-      },
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$83.4628646051075\\ dimensionless$",
-            "text/html": [
-              "83.4628646051075 dimensionless"
-            ],
-            "text/plain": [
-              "83.4628646051075 dimensionless"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 24
-        }
-      ],
-      "source": [
-        "particle_a.dimensionless_coagulation_kernel_hard_sphere(\n",
-        "    particle_b, std_environment\n",
-        ")"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "source": [
-        "## The coagulation rate coefficient\n",
-        "\n",
-        "Perhaps most importantly, we can calculate the binary coagulation rate coefficient. This is done via the method `dimensioned_coagulation_kernel`. Let's call help on this method to see what we can do."
-      ],
-      "metadata": {
-        "id": "kkUUE951wSa3"
-      }
-    },
-    {
-      "cell_type": "code",
-      "execution_count": 25,
-      "metadata": {
-        "id": "1rsNCSSEIhM8",
-        "colab": {
-          "base_uri": "https://localhost:8080/"
-        },
-        "outputId": "ffdfa99b-bf17-4adb-9919-25cc5ef4c539"
-      },
-      "outputs": [
-        {
-          "output_type": "stream",
-          "name": "stdout",
-          "text": [
-            "Help on function dimensioned_coagulation_kernel in module particula.aerosol_dynamics.particle:\n",
-            "\n",
-            "dimensioned_coagulation_kernel(self, other, environment: particula.aerosol_dynamics.environment.Environment, authors: str = 'cg2019') -> float\n",
-            "    Dimensioned particle--particle coagulation kernel.\n",
-            "    \n",
-            "    Checks units: [m**3/s]\n",
-            "    \n",
-            "    Paramaters:\n",
-            "    \n",
-            "        self:           particle 1\n",
-            "        other:          particle 2\n",
-            "        environment:    environment conditions\n",
-            "        authors:        authors of the parameterization\n",
-            "            - gh2012    https://doi.org/10.1103/PhysRevE.78.046402\n",
-            "            - cg2020    https://doi.org/XXXXXXXXXXXXXXXXXXXXXXXXXX\n",
-            "            - hard_sphere (from above)\n",
-            "            (default: cg2019)\n",
-            "\n"
-          ]
-        }
-      ],
-      "source": [
-        "help(particle.Particle.dimensioned_coagulation_kernel)"
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "source": [
-        "We see that we have have to supply two particles alongside the environment --- additionally, we get to choose between different parameterizations under \"authors\", which defaults to a recent study."
-      ],
-      "metadata": {
-        "id": "kdFBfkhPwnwh"
-      }
-    },
-    {
-      "cell_type": "code",
-      "source": [
-        "particle_a.dimensioned_coagulation_kernel(\n",
-        "    particle_b, std_environment\n",
-        ")"
-      ],
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "abd44jZLwkjk",
-        "outputId": "987f559f-41f7-4d2a-9139-5035938f62ff"
-      },
-      "execution_count": 26,
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$4.655713855465682\\times 10^{-16}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$",
-            "text/html": [
-              "4.655713855465682×10<sup>-16</sup> meter<sup>3</sup>/second"
-            ],
-            "text/plain": [
-              "4.655713855465682e-16 meter³/second"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 26
-        }
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "source": [
-        "For a more interesting example, let's look at the interaction between a negative ion and a positive particle. We first need to define these two entities alongside an environment."
-      ],
-      "metadata": {
-        "id": "yeUGra1-xIqR"
-      }
-    },
-    {
-      "cell_type": "code",
-      "source": [
-        "negative_ion = particle.Particle(\n",
-        "    name=\"negative_ion\",\n",
-        "    radius=0.5e-9,\n",
-        "    density=1.84e3,\n",
-        "    charge=-1,\n",
-        ")\n",
-        "\n",
-        "positive_particle = particle.Particle(\n",
-        "    name=\"positive_particle\",\n",
-        "    radius=3e-9,\n",
-        "    density=1.7e3,\n",
-        "    charge=1,\n",
-        ")\n",
-        "\n",
-        "standard_environment_ip = environment.Environment(\n",
-        "    temperature=300,\n",
-        "    pressure=101325,\n",
-        ")"
-      ],
-      "metadata": {
-        "id": "1wGYLv4pw-I3"
-      },
-      "execution_count": 27,
-      "outputs": []
-    },
-    {
-      "cell_type": "markdown",
-      "source": [
-        "The coagulation between these two entities should be approximately $10^{-6}$ cm$^{3}$/s."
-      ],
-      "metadata": {
-        "id": "0767yyBtxipq"
-      }
-    },
-    {
-      "cell_type": "code",
-      "source": [
-        "negative_ion.dimensioned_coagulation_kernel(\n",
-        "    positive_particle, standard_environment_ip\n",
-        ")"
-      ],
-      "metadata": {
-        "colab": {
-          "base_uri": "https://localhost:8080/",
-          "height": 37
-        },
-        "id": "5SSkbPEexbdS",
-        "outputId": "ff67f6e3-8517-40e4-c68e-4c82d1cbc199"
-      },
-      "execution_count": 28,
-      "outputs": [
-        {
-          "output_type": "execute_result",
-          "data": {
-            "text/latex": "$4.670176867752661\\times 10^{-13}\\ \\frac{\\mathrm{meter}^{3}}{\\mathrm{second}}$",
-            "text/html": [
-              "4.670176867752661×10<sup>-13</sup> meter<sup>3</sup>/second"
-            ],
-            "text/plain": [
-              "4.670176867752661e-13 meter³/second"
-            ]
-          },
-          "metadata": {},
-          "execution_count": 28
-        }
-      ]
-    },
-    {
-      "cell_type": "markdown",
-      "source": [
-        "That is approximatley $5 \\times 10^{-7}$ cm$^{3}$/s, which is within an order of magnitude of our physics-based reasoning."
-      ],
-      "metadata": {
-        "id": "uhNMxi3HybDu"
-      }
-    }
-  ],
-  "metadata": {
-    "colab": {
-      "name": "001_ParticleClass.ipynb",
-      "provenance": []
-    },
-    "kernelspec": {
-      "display_name": "Python 3",
-      "name": "python3"
-    },
-    "language_info": {
-      "name": "python"
-    }
-  },
-  "nbformat": 4,
-  "nbformat_minor": 0
-}
\ No newline at end of file
diff --git a/particula/particle.py b/particula/particle.py
index 339d86df6..6023dd63c 100644
--- a/particula/particle.py
+++ b/particula/particle.py
@@ -18,7 +18,7 @@ from particula.util.slip_correction import scf
 from particula.vapor import Vapor
 
 
-class ParticleDistribution(Vapor):  # pylint: disable=too-many-instance-attributes
+class ParticleDistribution(Vapor):
     """ starting a particle distribution from continuous pdf
     """
 
@@ -113,7 +113,9 @@ class ParticleInstances(ParticleDistribution):
         ) is None else in_radius(
             kwargs.get("particle_radius", None)
         )
-        self.particle_number = in_scalar(
+        self.particle_number = self.nparticles if kwargs.get(
+            "particle_radius", None
+        ) is None else in_scalar(
             kwargs.get("particle_number", 1)
         )
         self.particle_density = in_density(
@@ -137,10 +139,10 @@ class ParticleInstances(ParticleDistribution):
         return (
             self.pre_distribution()
             if self.kwargs.get("particle_radius", None) is None
-            else self.particle_number * self.particle_radius / self.volume
+            else self.particle_number / self.particle_radius / self.volume
         )
 
-    def mass(self):
+    def particle_mass(self):
         """ Returns mass of particle.
         """
         return mass(
diff --git a/setup.cfg b/setup.cfg
index ea5ac8496..3a5655831 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -40,6 +40,8 @@ dev =
     typing
     build
     flake8
+    jupyter-book
+    ghp-import
 
 [options.packages.find]
 where = .


Test patch:
diff --git a/particula/tests/particle_test.py b/particula/tests/particle_test.py
index 57f45a560..77429cc3a 100644
--- a/particula/tests/particle_test.py
+++ b/particula/tests/particle_test.py
@@ -55,7 +55,7 @@ def test_getters():
     """
 
     assert small_particle.particle_radius == 1.0e-9 * u.m
-    assert small_particle.mass() == (
+    assert small_particle.particle_mass() == (
         4.0/3.0 * np.pi * (1.0e-9 ** 3 * u.m ** 3) * (
             1.0 * u.kg / u.m**3
         )
@@ -71,7 +71,7 @@ def test_individual_shapes():
     ).particle_radius.m.shape == (2,)
     assert particle.Particle(
         particle_radius=[1, 2]
-    ).mass().m.shape == (2,)
+    ).particle_mass().m.shape == (2,)
     assert particle.Particle(
         particle_radius=[1, 2]
     ).knudsen_number().m.shape == (2,)