3D drift–diffusion: doped GaAs resistor

This tutorial demonstrates how to go from a quick 2D drift–diffusion setup to a full 3D electrical simulation for a simple—but very instructive—device: a doped gallium-arsenide (GaAs) resistor. It is ideal for teaching and example sheets: the physics are clean, the JV is near-linear, and the outputs nicely illustrate how potentials and currents distribute in space.
1. Create the 2D GaAs resistor
- New simulation → GaAs demos → Doped wire / resistor.
- Geometry: start in 2D with mesh points along X and Y. (Keep Z disabled for now; we’ll enable it later.)
- Doping: define an acceptor profile that increases from left→right (p-type gradient). The “wire” is just a rectangular GaAs block with this gradient applied.
- Contacts: opposing faces act as electrodes (top/bottom or left/right depending on your axis convention). One will be swept in voltage while the other is held at 0 V.
- Recombination: enable simple SRH (analytic form). No dynamic traps are required for this demo.
2. Run & sanity-check (2D)

Click Run. In the log:
- Step times should be a few ms each (on a modest laptop, order 6–8 ms).
- Contact currents match (top = bottom in steady-state). If they don’t, you are likely in time-domain or not converged.
- Residuals (total error) should be small: ≲10−9 is excellent. Values like 10−6…10−3 suggest re-checking settings/mesh.
Open Output:
- JV curve: near-linear behavior as expected for a resistor. Minor wobble can appear due to space-charge and doping.
- Snapshots: plot EC (conduction band; sometimes labelled “LUMO” in generic UI), ϕ (electrostatic potential), and carrier densities (n, p) as bias increases.
3. Extend to 3D: mesh & contacts

Enable the Z dimension in the mesh editor. Choose modest sizes first:
Nx × Ny × Nz = 5 × 5 × 5
. Runtime/memory scale roughly as
\( \mathcal{O}(N_x N_y N_z) \approx \mathcal{O}(N^3) \), so
10×10×10
is fine on a laptop, but 20×20×20
or more can get heavy quickly.
In 3D, contacts are finite-area objects (not implicitly spanning the full face as in 2D). Open the Dimension/Contact editor and:
- Set each contact’s width/depth to match the device (for full-face electrodes) or pick partial dimensions (e.g., 0.5×0.5 of the face) to study current spreading.
- Adjust offsets to place the pads where you want (demonstrates asymmetric injection/extraction).
4. Run & analyze (3D)

Run the 3D simulation (keep the mesh modest). Inspect:
- JV curve: should remain near-linear (resistive). Compare to 2D values.
- Potential ϕ in 3D: step bias and watch the 3D potential distribution evolve. Use slice/cross-section tools to “cut” through the device for clearer interpretation.
- Currents: plot the six components:
- Jn,x, Jn,y, Jn,z
- Jp,x, Jp,y, Jp,z
- Carriers: n(x,y,z,V), p
5. Practical tips & pitfalls

- Prototype in 1D/2D first. Validate physics and numerics, then switch on Z only when needed.
- Mesh economy beats brute force. More points ≠ more accuracy if the PDEs are solved to tight residuals between nodes. Increase mesh only to capture real gradients.
- Convergence checks: enforce small residuals (≲10−8), matched contact currents, and stable step times. If residuals plateau at 10−5…10−3, revisit scaling, biases, or mesh.
- SRH choice: the simple analytic SRH is fine for this resistor demo. Enable dynamic traps only when you need trap kinetics.
- Memory scaling: doubling mesh along each axis ~8× unknowns; watch RAM for
20×20×20
and above.