Eliminate interference effects in solar cell



I am using the organic solar cell with PC structure as a base file. I added glass to the structure, and on top of the glass an optical structure. I also took out the ZnO. The glass size I started with is 10 micrometers. Since there is a piece of glass in my simulaiton, I changed the background index to 1.00 (air)

After simulation there are oscillations in the data (power transmission) due to the Fabry Perot effect. I understand that I can simulate an actual glass size of 1 mm to eliminate interference effects, but the simulation would take forever. Is there a way I can simulate the solar cell with the optical structure “on top” of the cell, produce reasonable data, and not extend my simulation time to over 2 hours?

Inteference due to glass thickness
Abnormal variation in absorption data in a plasmonic solar cell


If the thickness of glass is so large that Fabry-Perot effects can be neglected, it is probably safe to have the PML boundary inside of glass, making sure it is at a distance of at least half the maximum wavelength. You can find a related discussion in this posting:

Hope this helps!


Thanks for the response. Can you explain what you mean by having the PML boundary inside of the glass? Do you mean to have the glass extend beyond the simulation region? (would this include placing the source within the glass as well)?

I attached my file if that can help you explain further.
SC_PH3TPCBM2.fsp (281.7 KB)



Yes, I meant placing the lower PML boundary of the simulation region so that the glass material extends beyond the region. Of course, this means that the layers below glass (ITO, PEDOT:PSS, etc.) won’t be included in the simulation. If you do this, you are effectively assuming that the glass substrate is so thick that we can assume it extends infinitely in the -z direction. If you don’t expect interference effects, this is probably a good approximation.

Following this idea I modified your simulation file (see SC_PH3TPCBM2_modified.fsp (277.9 KB)). I made sure both PML boundaries are at least half the maximum wavelength away from the MLA structure. I also used steep angle settings for the PML, which are recommended for this type of structure, as explained here.



Thanks for the response, makes more sense now.

In the simulation file you sent me, should the background index be set to 1? It had a value of 1.52 which I believe was meant to simulate the glass in the example file.

Based on the description you’ve provided, if I extend the lower PML region to the aluminum, the glass isn’t considered “infinite” and thus interference effects arise? If this is true would I be able to increase the glass size to reduce the interference effects (I want to include the entire solar cell)? Even if this does work, it would drastically increase my simulation time.

Since I want the effects of the MLA to be included in my solar cell, could I simulate a glass layer by changing the background index to 1.5 and simply position the MLA layer to a height equivalent to the thickness of glass? Obviously the simulation would extend to the solar cell, which is not represented in the picture.

Or could I ignore the glass and place the MLA on top of the solar cell? Would that setup be an accurate representation of MLA on top of glass?



I didn’t realize you had set the background index to 1.5 in your simulation. If light is coming from air and into the structure you should set the background index to 1 (air). The background index is used for all the regions where there is no structure present, that includes the region above the MLA. Therefore, the idea of removing the glass structure and using the background index 1.5 won’t work unless you want to simulate a situation where the source is inside glass.

If I understood correctly, you want to simulate how light coming from air is coupled into the structure using the microlenses, then travels through the glass and reaches the solar cell.

I would expect the Fabry-Perot oscillations due to the glass layer to be noticeable for wavelengths comparable to the thickness of the glass layer. Since you are considering wavelengths below 1 um, I would not expect that it is necessary to increase the thickness of glass all the way up to 1 mm (which is too large for a simulation with FDTD given the wavelength ~1um). However, there might be other sources of oscillations in your simulation.

Have you tried simulating glass with different thicknesses? I would try values less than 10 um before trying to simulate thicker layers, which would be much more challenging to simulate.


Yes that is correct.

Yes I have tried to simulate the solar cell with a glass layer with a size of 3 micrometers. I still have oscillations in my data set:

I also simulated it at 10 micrometers (at the expense of 3 hours). I found this result to be strange since the thickness of the glass is much larger than the wavelength. I also noticed these oscillations occur when I set my background index to 1 (as opposed to 1.52).

The above graphs simulate the solar cell without the microlens. Are there any other parameters that might influence oscillations in the data?



I need to check the simulation files in more detail. Can you share the file you used for the 3um thick glass?



Attached is the file I used. I used a script file to edit the size of the glass and to also change the positions of monitors, sunlight, and FDTD simulation boundary limits. The script is also attached if you want to see it. Let me know if you need anything else.

change layer heights.lsf (3.0 KB)
SC_PH3TPCBM.fsp (294.3 KB)



Sorry for the long wait. I did some checks comparing the results with the source in glass and in air (3um-thick glass) using a slightly modified simulation file: SC_PH3TPCBM_source_air.fsp (320.8 KB). I got the following results for the absorption at the PH3T:PCBM layer (between monitors 4 and 5):

This suggests that the thickness of glass is in fact the main responsible for the rapid oscillation you see in the spectrum. To confirm that the oscillations are physical I compared the net reflection from the monitor at the upper z boundary of the simulation with the reflected power calculated analytically using stackrt (see script chenying_solar_air.lsf (1010 Bytes)):

As you can see, the two calculations, analytical and numerical, are very close to each other. More importantly, in the case where the source is in air the reflection has rapid oscillations.

Therefore, at least in the case of a 3um-thick glass, the oscillations do not seem to be the result of a numerical artifact. You can use stackrt to check the results for the 10um-thick case.


Wow, thanks for your help. It’s pretty interesting to see the reflections occur in a 10 micrometer glass.

A few questions:

  • I noticed the Absorption graph you plotted is much cleaner than mine (more smooth). Is this because of the mesh you added to PEDOT:PSS and PH3T:PCBM layer?
  • What was used for the refractive index in the stackrt method for the reflection when the source is in the glass? I used several values above and below 1.5 and oscillations began to creep into the graphs at certain values.
  • I noticed you changed the z-min boundary condition to metal. Is there a difference between this method and extending the z-min PML region out of the aluminum? (the orignial file I sent is set up that way)
  • Did you make any other changes to the file to obtain your results (simulation parameters)

Do you happen to know the theoretical reason for oscillations? I used stackrt for a 10 um glass and there are oscillations in the reflection.

Can I instead use extremely small glass to remove the oscillations? I’ve collected data for a few sizes, and it seems to be smooth for 0.01 um glass. My only question is if this setup represents real cases?

Sorry for the lengthy post, but thank you so much for your help.


Hi @chenying

To answer your questions:

  • The added mesh helps. It is also important to check the distance from the structure to the PML (it should be at least half the maximum wavelength) and make sure the simulation runs for enough time.
  • I used the index from the material in the simulation (“SiO2 (Glass) - Palik”).
  • I used the metal boundary condition to reduce the simulation time. The reason is that essentially all the light is reflected at the aluminum layer. You should get the same results by using the PML boundary.

The oscillations are due to interference of the light bouncing back and forth in the glass layer. Presumably, for a thick glass layer of 10 um or more, the coherence lenght of the light propagating in the glass layer is not long enough to see the oscillations in an actual experiment. There is a useful discussion about temporal coherence in FDTD simulations here.

For this type of devices I think that the glass layers are typically thicker than a micron up to the mm range so probably it makes sense to try to remove the oscillations in a different way.

An alternative approach…

One idea that could work is separating your simulation in two: first you simulate the light focusing due to the microlenses on top of the structure and then you simulate the rest of the solar cell structure with a source embedded in glass (so that the Fabry-Perot oscillations are removed).

In the first simulation (left image) you only include the microlenses and the glass substrate. Light is incident from air above and you record the profile of the fields at the lower boundary. In the second simulation (right image) you create a custom source from the field profile obtained before and simulate the rest of the solar cell structure. An example that illustrates this idea can be found here.

Nanohole array with dielectric layer

So I tried what you suggested, but I am running into simulation problems. See picture below. This happened after I deleted my old FDTD simulation region and set a new one. I am using this script to run the 2 simulations
double simulation.lsf (4.0 KB)
SC_PH3TPCBM.fsp (1.7 MB)


This quote below is from a post i found in the knowledge exchange: Broadband imported source

If i read this correctly, the wavelength I need to import is the center wavelength from the frequency/wavelength tab in the second simulation?

Also how does the source create the electric field profile from one wavelength? Wouldn’t all the wavelengths need to be imported to recreate the same field profile?


Hi Chen Ying,

You are right, the imported source only injects the correct field profile for the center frequency. Since you are interested in a broad wavelength range, this is an important limitation in your case. You would have to run a sweep over source wavelength for the second simulation (the one with the lower part of the solar cell).

After discussing this with @kchow we think there is a better alternative, which is also much simpler because you only need to run one simulation (there is no need to split the structure in two parts, and you don’t need any sweep over wavelength).

The idea is based on this discussion about temporal incoherence. As explained there, you can use a spectral weight function W(ω) and the monochromatic response (from the FDTD simulation) to obtain the incoherent response at an angular frequency ωo for a physical source with a given coherence length. For W(ω) you can simply use a Lorentzian with center at ωo and width given by the coherence length. For long enough coherence length, the incoherent response approaches the monochromatic one, but as you decrease the coherence length the interference effects start to disappear.

A simple example where you can see this idea in action is attached: solar_planar_incoherent.fsp (290.5 KB) and usr_temporal_incoherence_solar.lsf (1.8 KB). The script will run the solar cell simulation from this example and post-process the monochromatic spectrum as in the temporal incoherence example. You can see that for a coherence length (in vacuum) of 3um the ripples in the spectrum are gone; as you increase the coherence length, the ripples reappear.

This behavior is consistent with the fact that the silicon layer in the simulation is 3um-thick so a coherence lenght of 3um is not long enough to see interference between light moving back and forth in the layer.

As a double check of you results you can use the “two-simulation” technique proposed before for checking a few frequency points.

Hope this helps!

Nanohole array with dielectric layer
Persistence of oscillations at higher wavelengths

Thanks for the help! Although I’m not conceptually familiar with this topic, it seems like it is easier alternative to your 1st solution.

Several questions:

  • First question: I compared the script files from the spectral averaging example and the planar solar cell example you provided. I noticed there was a difference between the partial spectral averaging calculation method.

from solar planar script file:

    # define a Lorentz function as the spectrum of the physical source
    h2 = delta / ( (w - w0(i))^2 + (pi*delta)^2 ); 

    # integral of the cw reflection weighted by the source spectrum divided by the 
    # integral of the source spectrum.
    R0(i) = integrate( h2*R,1,w) /
            integrate( h2  ,1,w) ;

from spectral average script file:

  h2=delta / ( (w - w_psa(i))^2 + (pi*delta)^2 );

  # manually calculate the partial spectral average.  It is the 
  # integral of the reflection weighted by the source spectrum and lorentz function divided by the 
  # integral of the sourcepower wieghted by the source spectrum and lorentz function.
  R_psa2(i) = integrate( sn*h2*R2            ,1,w) /
              integrate( sn*h2*source_power  ,1,w) ;
  • The spectral average method integrates “sn” defined as the source normalizaiton. Why was this variable not used in the planar solar cell script file?


Hi Chen Ying,

This is a very good point and a subtle one!

As you pointed out, in the spectral averaging we include the product sn*sourcepower, which corresponds to the source spectrum.

In the example discussed in the spectral averaging page, the source spectrum used for the averaging corresponds to the spectrum of the pulse used in the FDTD simulation. When that is the case, you have two options: using the built-in option in the monitor settings (as shown below) or post-process the standard Fourier transform results from your monitor (using a script like the one you quoted above).

If your actual source (for example the laser in your experimental setup) has a spectrum considerably different from that of the pulse used in FDTD, then the spectral averaging cannot be done using the built-in option and you need to do this as a post-processing step, where sn*sourcepower is replaced by the spectrum of the actual source; for instance, in your case you could use the solar spectrum.

Having said this, now it is easier to understand what was done in the temporal incoherence script. The absence of sn*sourcepower simply means that we used a flat spectrum where all the frequencies have the same weight. Alternatively, you can use the solar spectrum, which would probably give you results closer to experiment, given the fact that it takes into account the actual spectrum of the source.


Thanks so much for the reply, it made a lot of sense.

Are there other weighting functions I can use to possibly increase the accuracy of the results? I am not very familiar with the concept presented in the incoherence section, so I wanted to ask. I performed the simulation and compared both methods you presented:

Another note: The Lorentz distribution is defined below from Wikipedia:

but the script has the pi term term squared. Was this a mistake?


Hi Chen Ying,

If you define “delta” in the script so that:

then the expression from Wikipedia and the one used in the script for the Lorentzian match:

Regarding the choice of the weighting function, this is kind of arbitrary, you could use a Gaussian for instance. I would not expect significant changes in the results if the function is sufficiently localized. After all, we normalize the result dividing by the integral of the weighting function.

The difference between the two methods (“6 um Lc” and “double sim” in the plot) might be due to the choice of coherent length because you can see how the oscillations in the two-simulation results have a larger amplitude. You could try increasing the coherence length.