mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
24d3cf8244
* The black formatter is no longer beta * pre-commit autoupdate * pre-commit autoupdate * Remove project_euler/problem_145 which is killing our CI tests * updating DIRECTORY.md Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
# https://en.wikipedia.org/wiki/Charge_carrier_density
|
|
# https://www.pveducation.org/pvcdrom/pn-junctions/equilibrium-carrier-concentration
|
|
# http://www.ece.utep.edu/courses/ee3329/ee3329/Studyguide/ToC/Fundamentals/Carriers/concentrations.html
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
def carrier_concentration(
|
|
electron_conc: float,
|
|
hole_conc: float,
|
|
intrinsic_conc: float,
|
|
) -> tuple:
|
|
"""
|
|
This function can calculate any one of the three -
|
|
1. Electron Concentration
|
|
2, Hole Concentration
|
|
3. Intrinsic Concentration
|
|
given the other two.
|
|
Examples -
|
|
>>> carrier_concentration(electron_conc=25, hole_conc=100, intrinsic_conc=0)
|
|
('intrinsic_conc', 50.0)
|
|
>>> carrier_concentration(electron_conc=0, hole_conc=1600, intrinsic_conc=200)
|
|
('electron_conc', 25.0)
|
|
>>> carrier_concentration(electron_conc=1000, hole_conc=0, intrinsic_conc=1200)
|
|
('hole_conc', 1440.0)
|
|
>>> carrier_concentration(electron_conc=1000, hole_conc=400, intrinsic_conc=1200)
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 37, in <module>
|
|
ValueError: You cannot supply more or less than 2 values
|
|
>>> carrier_concentration(electron_conc=-1000, hole_conc=0, intrinsic_conc=1200)
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 40, in <module>
|
|
ValueError: Electron concentration cannot be negative in a semiconductor
|
|
>>> carrier_concentration(electron_conc=0, hole_conc=-400, intrinsic_conc=1200)
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 44, in <module>
|
|
ValueError: Hole concentration cannot be negative in a semiconductor
|
|
>>> carrier_concentration(electron_conc=0, hole_conc=400, intrinsic_conc=-1200)
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 48, in <module>
|
|
ValueError: Intrinsic concentration cannot be negative in a semiconductor
|
|
"""
|
|
if (electron_conc, hole_conc, intrinsic_conc).count(0) != 1:
|
|
raise ValueError("You cannot supply more or less than 2 values")
|
|
elif electron_conc < 0:
|
|
raise ValueError("Electron concentration cannot be negative in a semiconductor")
|
|
elif hole_conc < 0:
|
|
raise ValueError("Hole concentration cannot be negative in a semiconductor")
|
|
elif intrinsic_conc < 0:
|
|
raise ValueError(
|
|
"Intrinsic concentration cannot be negative in a semiconductor"
|
|
)
|
|
elif electron_conc == 0:
|
|
return (
|
|
"electron_conc",
|
|
intrinsic_conc**2 / hole_conc,
|
|
)
|
|
elif hole_conc == 0:
|
|
return (
|
|
"hole_conc",
|
|
intrinsic_conc**2 / electron_conc,
|
|
)
|
|
elif intrinsic_conc == 0:
|
|
return (
|
|
"intrinsic_conc",
|
|
(electron_conc * hole_conc) ** 0.5,
|
|
)
|
|
else:
|
|
return (-1, -1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|