Nanohole array with dielectric layer



I am trying to simulate a rather complicated plasmonic device and as I am rather new to Lumerical, I feel it is better to work from the Nanohole array example given in the tutorials on this website
I have modified the example including moving the source so that it is shining from above, and changing several geometries.
The biggest modification is that I have inserted a new ‘dielectric’ layer between the ‘film’ and ‘substrate’ layers.
If ‘dielectric’ is thin, I believe I get a reasonable result, however, if ‘dielectric’ is thick I see several features in the transmission that I did not expect.
I assume that this is due to some kind of Fabry-Perot effect when the thickness of ‘dielectric’ is comparable to the wavelength of the light, however, my intuition (from previous experiments, not simulations) is that the result is non-physical. Especially the large number of features when the thickness of the layer is significantly larger than the wavelength.
So, my question is whether my result is indeed correct or whether these features in the transmission are instead just an artefact of either my simulation parameters or the FDTD method in general? If it is an artefact, how can I change my simulation to get a more physical result?
For example, I found described here a suggestion to split the device into sections and use a custom source from the monitor data

Attached is my Lumerical file and spectra for four thicknesses (50nm,100nm,500nm,3000nm).
Any suggestions will be gratefully received.

sp_array_b2.fsp (267.6 KB)


Hi @ie5003_allison,

Sorry for the long wait! I checked your simulation and I noticed the spikes that arise in the transmission spectrum as the thickness of the dielectric layer increases. I think these features are physical and, as you suspect, they are associated with Fabry-Perot oscillations caused by multiple reflections between the interfaces of the dielectric layer. You can see this effect in a simple simulation of the dielectric and substrate (i.e. removing the gold layer). In this situation, you can compare the FDTD results with an analytical calculation using stackrt as I did in sp_array_b2_stackrt.fsp (269.8 KB) and test_stackrt.lsf (508 Bytes). Here I used a thickness of 1um, which is enough to see the Fabry-Perot effects. As you increase the thickness, the period of the oscillations in the spectrum becomes shorter so we expect more pronounced effects.

For a thickness of 1um, I reran your simulation increasing the number of PML layers (to check if there where some artifacts caused by potential PML back-reflections) and the simulation time (to make sure energy has decreased enough inside the FDTD region by the end of the simulation): sp_array_b2_modFG.fsp (277.0 KB). The results still show the kind of features you pointed out:

It is possible that experimentally you won’t see these features for very thick layers because it would require light to have a long coherence length so that you can see the interference of light moving up and down inside the dielectric layer. In the FDTD simulation, on the other hand, incoherence is not included so Fabry-Perot effects will arise, as noted before.

Splitting the simulation in sections is an alternative to artificially remove the effects due to multiple reflections. However, there is a much better (and physically sound) approach based on the idea of temporal incoherence. For more information, please take a look at this post:

Hope this helps!



Thanks a lot for the reply it is really a great help.

Firstly I am glad that there was nothing fundamentally wrong with my simulation. It always takes time to get used to new software and it’s easy to go off in the wrong direction. I was having trouble reconciling the logic of Fabry-Perot oscillations with the lack of experimental observation. In practice, we are most interested in the electric field on the surface of the gold, so (although memory intensive) I can record the field at all wavelengths with a DFTMonitor to check what is happening at each peak in the transmission. However, that doesn’t sound particularly rigourous.

I like your idea of coherence. It makes the most physical sense to me, so I will read up on the post that you linked to. I expect that I will have further questions.

I was also wondering whether surface roughness and inhomogeneity could be playing a part. If true I imagine that this would be difficult to simulate. Is there any built-in function in Lumerical that can make the surfaces “randomly” rough, or is that something that I would need to draw myself?

Thanks again for your reply.


Hi @ie5003_allison,

You are welcome! Feel free to ask more questions as you work on your simulation.

There is a KB page where we discuss how to include roughness in structures:

Hope this helps!



Thank you very much. Yes, I found that article about surface roughness soon after my reply and found it useful. Perhaps the answer is a bit of both.

I have some follow up questions.

  1. Regarding the coherence of the light, my understanding is that this is effectively post-processing the transmission data. This is useful in itself, but I am also interested in the electric field strength (i.e. using a DFTMonitor). However, presumably the DFTMonitor data is incorrect because it has not been through the post-processing. Is there any further post-processing that can be performed to calculate the electric field strength for incoherent light? Or perhaps, is there a way to include the incoherence of the light in the initial simulation rather than as post-processing.
  2. Regarding the surface roughness, could you advise if there is a good way in the Lumerical CAD environment to make the sketch on the right of the attached file? The left picture is a slice through a nanohole array covered in a thin ‘pink’ film. To make it I take advantage of the mesh order: firstly I make all the horizontal layers and then I make a ‘pink’ hole through the gold layer, and then a ‘blue’ hole (partially) through the ‘pink’ hole. However, when I add surface roughness to the horizontal layers (in the manner of the article you linked to) I can only find a way to make the drawing in the middle. I cannot find a way to fill the bottom of the well with ‘pink’ while keeping the same surface profile as the layer below it. Is there a way? If it helps I will upload the Lumerical file later.



It’s not possible to simulate incoherent light in the simulation since the FDTD method is fundamentally coherent, so you would need to get the electric fields due to incoherent light by averaging the fields at each position from 2 simulations using orthogonal polarizations like in the example here:

For your second question, did you need the pink layer to have a random roughness, or did you want the layer to have a uniform thickness and keep the exact same surface shape as the substrate below? If it’s the first case with random roughness, it could be done by adding the roughness to the blue hole which forms the well. If it’s the second case then it might be helpful if you could upload the file for us to look into.



I expected that the FDTD method is fundamentally coherent, so thanks for clearing that up for me.
I will read the example that you gave for averaging the two simulations.

Regarding the second question, the pink layer should keep the same surface shape as the substrate below. (Essentially the grey substrate has a random roughness and all the subsequent layers have a fixed thickness, so the yellow and pink layers will have the same surface shape as the substrate.)
Edited: my current design results in an index profile like this:

Edited to include the file.
usr_surface_roughness_tmp2.fsp (1.7 MB)



I was able to get the result by extending the z span of the holes, then adding a new structure group which set up a layer which has a thickness only in the x,y positions inside the circular regions of the holes with mesh order 1.

Here is the file with the added structure group named “dielectric_rough_circles”.
usr_surface_roughness_tmp2_new.fsp (2.0 MB)

The setup script is very similar to the rough surface group but I added some code starting in line 119 of the setup script which generates a filter to specify the circular regions where I wanted to add the coating.

Please try it out!


Thank you!
I think I roughly understand the code and it is a very neat solution.
With some thought applying this filtering method can make some very interesting structures.



Edit: I think I answered my own question and was simply over thinking things before. Presumably I just need to apply periodic boundary conditions. I leave the question below in case there is a more difficult answer.

Post before edit…

I have a follow up question regarding symmetry of the rough surface described above. I could not find the answer elsewhere on the site.

Perhaps it is easier to think first of the “wavy_surf” surface available in the object library.
I can imagine that if the waves are only along one axis (for example x) it is possible to apply (anti)symmetric boundary conditions, however, when there are waves along two axis (x and y) I cannot see how such boundary conditions can be applied - for while the wave along x may be symmetric at y=0, it will not be symmetric at all y!=0. Is this correct?



You’re right, using the periodic boundaries would be the way to go!


Thank you for the confirmation. Sometimes the answers are simple.



I have some further questions regarding the choice of substrate in the nanohole array example. (Maybe this should be split into another topic.)
Could you please explain why I get the following result, especially if it is due to my misunderstanding of the FDTD method.

In addition, could you please tell me the best method to calculate the absorption in the gold layer?

FYI, I am running version 8.17.1157 of FDTD Solutions.

Here is my nanohole array simulation.sp_array constant.fsp (261.9 KB) it is almost exactly the same as the example from the website. The only major difference is that I made the FDTD and substrate regions bigger (for future purposes not important here). There are two sources, identical except for their position, that can be enabled and disabled depending on which source I want to use.

As to be expected, I get identical results for the transmission (upper figure) and reflection (lower figure) using the two different positions for the sources.

The refractive index of the substrate in that previous simulation was constant (n=1.45), but I would like to use the wavelength dependent refractive index. I therefore changed the material of the substrate to “SiO2 (Glass) - Palik” and got a reasonable looking fit for n and a small value of k as can be found in this file sp_array SiO2.fsp (274.1 KB). This simulation gives an almost identical result for the transmission (upper figure), but the reflection (lower figure) is very different.

In particular the reflection is greater than 1 at certain wavelengths and greatly depends on the position of the source.

Why is the reflection different? Is it due to the fit of n and k for SiO2? (I tried different fits, but the result was always unusual.) Or the position of the source? Or the position of the monitor? Or is it just not possible to have the source (and monitor) within a material where n varies with wavelength?


This is a bug in the software which will be fixed in the next release of the software (it should be available in the next few weeks). I was able to test it with an internal preview version of the software where I was able to see that the problem is fixed and the reflection looks the same as the case where the substrate is a dielectric with n=1.45.

We typically do not recommend injecting the source from within a dispersive medium where there is absorption since there will be some power absorbed within the medium which can cause the results to vary depending on the position of the source and monitor, and it can cause power normalization issues. However for this particular case it shouldn’t make much difference since the absorption is so small.


Thank you very much. I am glad to hear that the bug has been fixed.
Will the new release be available as a beta version sooner, or only when the full release is made in the next few weeks? Ideally I would like to recheck some simulations as soon as possible, but I understand that these things take time.

In the meantime,could you confirm that the reflection with the wavelength dependent n and k looks the same as that with n=1.45? (Or did you only mean that the reflection does not change with source position?)

Thanks again.


Yes, the reflection with wavelength dependent n and k looks the same as the result with n=1.45.

There is a beta version already available, but unfortunately the correction for this particular bug didn’t make it into the beta version so you would have to wait until the official release version. Sorry for the inconvenience!


Thanks again.
Will the new version be announced on this forum, or do I need to recheck the download page regularly?



Sorry for the delayed reply as I was away last week. The new version has already been released and you can now download it from the customer downloads page here:


Thank you very much for letting me know.
I will try the new version and return to this thread if I have any problem.