Calculation of reflectance and transmittance of randomly distributed particles

82 views
Skip to first unread message

zhengxin song

unread,
Apr 11, 2023, 11:32:00 PM4/11/23
to Smuthi
Dear all,

I am trying to calculate the reflectance and transmittance of a system of randomly distributed particles when the incident wave is a plane wave, but I don't know how to calculate it.

I attempted to use a function for random particle distribution with periodic boundary, but it resulted in an error: "AttributeError: 'NoneType' object has no attribute 'reference_point'." As such, I tried generating the particle positions using the random distribution function first, then canceling the random distribution function to fix the particle positions. Although this approach still results in an essentially periodic arrangement, it is the only option available to me at the moment. I compared the reflectance and transmittance obtained in this way with the results of the Monte Carlo method, and the difference is significant. If the incident light source is changed to a Gaussian beam, the results also differ significantly from the Monte Carlo method.

Here is my program along with the refractive index of the particles and the result data of Monte Carlo method. Since I have not yet mastered the integration path setting method, the integration path setting in the program may be wrong.How should I modify the program to calculate its reflectance and transmittance?

Also, when the refractive index of the substrate has an imaginary part, can't smuthi calculate the scattering cross section at the bottom? So is it possible to find the absorbance in this case?

I would be grateful if I could get your help.

Best regards,
Song Zhegnxin
result data of Monte Carlo method.txt
multiple particles_random.py
nk-SiO2-3-14.yml

Amos Egel

unread,
Apr 13, 2023, 7:24:03 AM4/13/23
to zhengxin song, Smuthi
Dear Zhengxin,

thanks for you interest in the Smuthi code and welcome in the mailing list.

The error comes from the following lines in your script.

# plane wave expansion of total transmitted field
pwe_total_T = pbpost.transmitted_plane_wave_expansion(initial_field,
                                                      random_sequential_addition(),
                                                      layer_system,
                                                      a1, a2)
# plane wave expansion of total reflected field
pwe_total_R = pbpost.reflected_plane_wave_expansion(initial_field,
                                                    random_sequential_addition(),
                                                    layer_system,
                                                    a1, a2)

In each of these commands, you calculate a new particle list by calling the random_sequential_addition(). But these methods expect the same particle list for which the simulation has been run already. In fact, some simulation results are stored in the particle objects. So generating new particle lists means they don't have the simulation results to them and this is why the error is thrown. Besides, the newly generated particle lists might differ in position from the previous ones, as they are random generated ...

You can try

my_particle_list = random_sequential_addition()

and then

simulation = Simulation(...
                        particle_list=my_particle_list,
                        ...)

and finally

pwe_total_T = pbpost.transmitted_plane_wave_expansion(...
                                                      my_particle_list,
                                                      ...)

pwe_total_R = pbpost.reflected_plane_wave_expansion(...
                                                    my_particle_list,
                                                    ...)

Regarding the imaginary part of the substrate refractive index: It seems to me that the imaginary part of the refractive index is very small, right? So maybe you want to just neglect it (i.e., set the imaginary part to zero)? Then you could work with scattering cross sections and other far field operations both in the top and bottom layer.

Some other observations: The layer thickness of 100 is pretty large compared to the wavelength of 3. That can lead to problems. Smuthi is designed for mesoscopic systems, where layer thicknesses are not much larger than the wavelength (a factor of 10 is probably ok, but 30 could be too much. You have to check ...). Typically, we would treat very thick layers as infinitely thick and then do an incoherent treatment of layer systems with multiple very thick layers.

The integral contour looks not ideal to me, it should deflect into the imaginary already before 1 (to avoid the branch cut at neff=1). You can probably just go with the standard contour, wihtout defining one by yourself. The automatically assigned integral contour takes care of avoiding the branch cuts.

Hope this helps a bit. If you have more questions or if anything is still unclear, don't hestiate to ask again.

Best regards,
Amos


--
Smuthi project repository: https://gitlab.com/AmosEgel/smuthi
Online documentation https://smuthi.readthedocs.io/en/latest/
---
You received this message because you are subscribed to the Google Groups "Smuthi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to smuthi+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/smuthi/cfbe78d8-5c34-4a7c-a723-0b6ef1176d09n%40googlegroups.com.
Reply all
Reply to author
Forward
Message has been deleted
0 new messages