Home Examples Screenshots User manual Bluesky logo
OghmaNano Simulate organic/Perovskite Solar Cells, OFETs, and OLEDs DOWNLOAD

Large-Area Perovskite Module Tutorial Part B: Run the simulation and inspect the outputs

Large-area module simulations are more complicated than a single-device drift–diffusion run, so it is worth watching what the solver is doing. In this example, OghmaNano runs the simulation in two main stages: (i) the optical solver (3D optical calculation), then (ii) the electrical circuit solver (Kirchhoff current/voltage equations on the circuit mesh). The terminal output is your quickest way of spotting problems early (for example, a disconnected circuit or missing contacts).

Step 1: Run the simulation

Click the Run simulation button (blue triangle) shown in ??. This simulation will take a while to run (it is doing a 3D optical stage followed by a large circuit solve). While it runs, keep an eye on the Terminal tab, because it provides real-time information about convergence and currents.

OghmaNano main window showing the blue Run simulation button and the Output tab containing generated result files.
Click Run simulation (blue triangle) to start the module simulation.
Terminal output showing the optical solver running at many wavelength slices, followed by the electrical stage and 'Finished with multidimensional autoramp' messages.
Early-stage terminal output: the solver first runs the optical stage (many wavelength slices), then moves on to the electrical stage.
Terminal output later in the JV sweep showing contact currents changing sign around Voc and convergence metric f() values.
Mid-sweep terminal output: the contact currents flip sign as the sweep passes VOC. You can often see the JV curve forming directly in the log.

Step 2: Understand what the terminal output is telling you

For these complicated simulations, the terminal output is not “noise” — it is a diagnostic. In ?? you can see that the solver initially runs the optical stage. This can take a while because it is solving in 3D. Once optical generation is prepared, the solver starts the electrical stage and prints lines for each bias point.

A key line looks like this (format will vary slightly depending on settings):

You will often see higher error near the start of a sweep (especially near 0 V), and the error may drop as the solver moves away from that point. As a rule of thumb, I trust results far more when the solver is reaching errors like 10-4 or smaller, and ideally down to 10-9 for “clean” convergence. (In the example logs shown here you can see the error trending downward as the sweep progresses.)

In ?? you can see something very useful: about midway through the sweep the current on the ground contact changes sign, and the current on the change contact changes sign in the opposite direction. That sign flip is exactly what you expect as the sweep passes VOC: below VOC the illuminated device sources power; above VOC it is forward-biased and consumes power like a diode. In other words, you can often “see” the JV curve forming directly in the contact-current column.

💡 Why watch the terminal? If something is wrong (e.g. the circuit is not connected, a contact mask missed the mesh, or a region is floating), you will usually see it immediately: currents collapse toward zero, currents become nonsensical, or the solver fails to reduce f(). Catching that early can save you a long wait.

Step 3: Inspect the output files

When the simulation finishes, the Output tab will contain a set of files like those shown in ??. The key results for this part of the tutorial are the contact JV curves: jv_contact0.csv and jv_contact1.csv. These contain the current density at each contact as a function of the applied voltage.

Double-click jv_contact0.csv and jv_contact1.csv to plot them. Example plots are shown in ?? and ??. A zoomed-in view (useful for reading off VOC and the curvature near the knee) is shown in ??.

Plot window showing Voltage–Current density curve for the ground contact, with current density decreasing as voltage increases.
JV at the ground contact (jv_contact0.csv).
Plot window showing Voltage–Current density curve for the change contact, with current density increasing strongly in forward bias.
JV at the change contact (jv_contact1.csv).
Zoomed-in JV plot highlighting the knee region and the transition around open-circuit voltage.
Zoomed view of the JV behaviour (useful for inspecting the knee and reading off VOC more clearly).
✅ What to expect

Under illumination, at 0 V you should observe a non-zero current magnitude at the contacts (the module’s JSC). As voltage increases, the current approaches zero around VOC, then changes sign in forward bias. If the JV curves look flat (near-zero everywhere), that usually indicates a disconnected circuit, missing contacts, or a geometry/contact-mask mismatch.

Step 4: Inspect the solver mesh and circuit representation

Large-area simulations can fail for geometrical reasons (misplaced contacts, missing regions, unintended gaps), so it is useful to know where to look. In particular:

Example views of these files are shown in ??, ??, and ??. Conceptually, this is the same as solving a standard circuit: nodes + links + Kirchhoff’s laws — just at much larger scale.

3D mesh view of the solver geometry showing a simplified triangular representation and bounding shapes.
device.csv: the simplified mesh representation used by the solver. If something is geometrically wrong, it is often obvious here.
Table or plot representing electrical nodes in the circuit extracted from electrical-nodes.csv.
electrical_nodes.csv: the Kirchhoff current nodes used for computation.

Step 5: Locate the optical settings (Transfer Matrix)

This module simulation includes optical generation, and you can find the optical tools in the Optical ribbon (??). Click Transfer Matrix to open the Transfer Matrix window.

Important: do not run the Transfer Matrix tool from here for this tutorial. The Transfer Matrix window is fundamentally a 1D view through the stack, whereas this simulation is 3D. It is useful for configuration and sanity-checking materials/stack settings, but it is not a substitute for the full 3D optical stage you just ran. For now, open it and click Configure — we will use this entry point in Part C when we start making controlled changes.

OghmaNano optical ribbon toolbar showing Light sources, Transfer Matrix, Optical outcoupling, Ray tracing editor, Optical detectors, FDTD simulation, Mode calculator, and related tools.
The Optical ribbon. Click Transfer Matrix, then open Configure (do not run the 1D calculation here for this 3D tutorial).

Step 5: Locate the optical settings (Transfer Matrix)

This module simulation includes optical generation, and you can find the optical tools in the Optical ribbon (??). Click Transfer Matrix to open the Transfer Matrix window.

Important: do not run the Transfer Matrix tool from here for this tutorial. The Transfer Matrix window is fundamentally a 1D view through the stack, whereas this simulation is 3D. It is useful for configuration and sanity-checking materials/stack settings, but it is not a substitute for the full 3D optical stage you just ran.

Instead, click the Configure (cog) option to open the optical configuration panel shown in ??.

OghmaNano Transfer Matrix configuration panel showing photon efficiency set to 0.6 and other solver settings.
The Transfer Matrix configuration panel. The key parameter for this tutorial is Photon efficiency (here set to 0.6), which scales how much optical absorption becomes usable photocurrent.

Photon efficiency and the solar-cell diode equation

The photon efficiency (sometimes called an internal quantum efficiency factor in this simplified context) is a scalar multiplier that tells the model what fraction of absorbed photons actually generate extractable charge carriers (electrons and holes). If the photon efficiency is 0, there is no photocurrent. If it is 1, then (in this simplified picture) every absorbed photon contributes to photocurrent. In most real devices, a value around 0.6 is a reasonable order-of-magnitude.

In diode language, you can think of it as scaling the photocurrent term in the illuminated diode equation: ??.

$$ J(V) = J_0\left[\exp\!\left(\frac{qV}{nk_\mathrm{B}T}\right)-1\right] - \eta_{\mathrm{ph}}\,J_{\mathrm{ph}} $$

Here, \(J_0\) is the diode saturation current density, \(n\) is the ideality factor, and \(J_{\mathrm{ph}}\) is the photocurrent density predicted from the optical model (i.e. from the absorbed-photon/generation calculation). The parameter \(\eta_{\mathrm{ph}}\) is the photon efficiency from ??, which simply scales the contribution of the photocurrent term. Setting \(\eta_{\mathrm{ph}}=0.6\) means “60% of absorbed photons become extractable carriers” in this effective model.

Practically: if your simulated \(J_\mathrm{SC}\) is badly mismatched to experiment and you are confident the electrical part of the circuit model is sensible, \(\eta_{\mathrm{ph}}\) is one of the quickest knobs you can use to bring the absolute current level into line. It is very unlikely to be above 1; if you find you need \(\eta_{\mathrm{ph}} > 1\), that usually indicates something else is wrong (for example, optical constants / absorption coefficients are not consistent).

🧪 Task: Explore photon efficiency

  1. Open the Optical ribbon and go to Transfer Matrix → Configure (??).
  2. Change Photon efficiency from 0.6 to a lower value (e.g. 0.3), rerun the simulation, and observe how the contact JV curves change.
  3. Try a higher value (e.g. 0.9) and rerun. What happens to \(J_\mathrm{SC}\) and the overall JV curve shape?
  4. After finishing, set Photon efficiency back to 0.6.

👉 Next step: Continue to Part C where we start altering parameters and interpreting module-scale losses (series resistance, contact limitations, and optical generation effects).