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'