Fermi-Dirac Example
Location: examples/rappture2/fermi/
A complete scientific tool: computes the Fermi-Dirac distribution function and its derivative for a given temperature and Fermi energy.
This is the rappture2web equivalent of the classic Rappture Fermi-Dirac example.
tool.xml
<?xml version="1.0"?>
<run xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../rappture2web/contract.xsd">
<tool>
<title>Fermi-Dirac Distribution</title>
<about>Computes the Fermi-Dirac distribution function f(E) = 1 / (1 + exp((E - Ef) / kT))
for a range of energies around the Fermi level.
Uses rappture2web.rp_library — outputs stream live to the browser.</about>
<command>python3 @tool/fermi.py @driver</command>
<contract>
<input>
<number id="temperature">
<about>
<label>Temperature</label>
<description>Temperature of the system. Higher temperatures broaden the Fermi-Dirac distribution.</description>
</about>
<units>K</units>
<min>1K</min>
<max>5000K</max>
<default>300K</default>
</number>
<number id="Ef">
<about>
<label>Fermi Level</label>
<description>The Fermi energy level Ef. States below Ef are mostly occupied; above Ef mostly empty.</description>
</about>
<units>eV</units>
<min>-5eV</min>
<max>5eV</max>
<default>0eV</default>
</number>
<number id="erange">
<about>
<label>Energy Range ±</label>
<description>Plot energy from Ef - range to Ef + range.</description>
</about>
<units>eV</units>
<min>0.1eV</min>
<max>10eV</max>
<default>2eV</default>
</number>
<integer id="npoints">
<about>
<label>Number of Points</label>
<description>Number of sample points along the energy axis.</description>
</about>
<min>10</min>
<max>1000</max>
<default>200</default>
</integer>
</input>
<output>
<curve id="fermi"><about><label>Fermi-Dirac Distribution</label><description>Occupation probability versus energy.</description></about><xaxis><label>Energy</label><units>eV</units></xaxis><yaxis><label>f(E)</label></yaxis></curve>
<curve id="deriv"><about><label>Derivative</label><description>Derivative of the Fermi-Dirac distribution.</description></about><xaxis><label>Energy</label><units>eV</units></xaxis><yaxis><label>-df/dE</label></yaxis></curve>
<number id="kT"><about><label>Thermal Energy kT</label><description>Thermal energy for the selected temperature.</description></about><units>eV</units></number>
<number id="T"><about><label>Temperature</label><description>Echo of the selected system temperature.</description></about><units>K</units></number>
</output>
</contract>
</tool>
<input>
<number id="temperature">
<about>
<label>Temperature</label>
<description>Temperature of the system. Higher temperatures broaden the Fermi-Dirac distribution.</description>
</about>
<units>K</units>
<min>1K</min>
<max>5000K</max>
<default>300K</default>
<preset>
<value>4K</value>
<label>4K (liquid helium)</label>
</preset>
<preset>
<value>77K</value>
<label>77K (liquid nitrogen)</label>
</preset>
<preset>
<value>300K</value>
<label>300K (room temperature)</label>
</preset>
<preset>
<value>1000K</value>
<label>1000K (high temperature)</label>
</preset>
</number>
<number id="Ef">
<about>
<label>Fermi Level</label>
<description>The Fermi energy level Ef. States below Ef are mostly occupied; above Ef mostly empty.</description>
</about>
<units>eV</units>
<min>-5eV</min>
<max>5eV</max>
<default>0eV</default>
</number>
<number id="erange">
<about>
<label>Energy Range ±</label>
<description>Plot energy from Ef - range to Ef + range.</description>
</about>
<units>eV</units>
<min>0.1eV</min>
<max>10eV</max>
<default>2eV</default>
</number>
<integer id="npoints">
<about>
<label>Number of Points</label>
<description>Number of sample points along the energy axis.</description>
</about>
<min>10</min>
<max>1000</max>
<default>200</default>
</integer>
</input>
</run>
Running
rappture2web examples/rappture2/fermi/
Inputs
Temperature (K) — with presets for room temperature and liquid nitrogen
Fermi Energy (eV) — with presets for common semiconductor values
Energy Range (eV) — range around the Fermi level
Number of Points — resolution of the output curves
Outputs
Fermi-Dirac Distribution — curve: f(E) vs. E
df/dE — curve: energy derivative
Thermal Energy kT — scalar number
Temperature — scalar number
Key code patterns
Reading inputs with unit conversion:
T_str = rx['input.(temperature).current'].value
T = float(Rappture.Units.convert(T_str, to='K', units='off'))
Writing a curve output:
fd = rx['output.curve(fermi)']
fd['about.label'] = 'Fermi-Dirac Distribution'
fd['xaxis.label'] = 'Energy'
fd['xaxis.units'] = 'eV'
fd['component.xy'] = (E_vals, f_vals)
Writing a scalar number output:
rx['output.number(kT).about.label'] = 'Thermal Energy kT'
rx['output.number(kT).units'] = 'eV'
rx['output.number(kT).current'] = f'{kT:.6f}eV'