HelgeGehring / femwell

FEM mode solver for photonic waveguides
https://helgegehring.github.io/femwell/
GNU General Public License v3.0
104 stars 30 forks source link

Anisotropic materials #80

Open ledezmaluism opened 1 year ago

ledezmaluism commented 1 year ago

Are anisotropic materials supported? I couldn't find anything in the documentation or the examples.

HelgeGehring commented 1 year ago

Not yet, but it would be great to add that!

I'd guess first of all we need some examples to reproduce to test what we'll implement.

I found this paper https://doi.org/10.1109/JLT.2008.923643

Would you have another example? The simpler the better.

@DorisReiter it wouldn't be much of a change to take care of this in the docs, right?

ledezmaluism commented 1 year ago

What about comparing with a commercial tool? I have access to a commercial software that I have been using but I want to move to open source. So, I could create a simple example and simulate it with and without anisotropy, and then use that data to compare against the results from femwell. The example I propose would be a photonic waveguide in thin-film lithium niobate. Would that work?

HelgeGehring commented 1 year ago

That would be the second step - but a great second step! thanks for doing that :)

I usually want to reproduce a paper, as it's peer-reviewed and accessible online.

Up to now i didn't need to do a calculation using anisotropic materials, would a tensor like image be enough? Or do we want to put in a full 3x3 matrix?

ledezmaluism commented 1 year ago

Yes, that tensor is more than enough!

In photonics, typically the direction of propagation is orthogonal to one of the principal axes of the crystal. This is guaranteed in photonic integrated circuits since the surface of the chip is normal to one of the principal axes.

Furthermore, most of the time people place their waveguides along another of the principal axes of the crystal, so the matrix becomes diagonal ($\epsilon_{xy}=0$). I've been simulating these for years and have only ever needed diagonal matrices, so even that would be enough for most applications!

HelgeGehring commented 1 year ago

Hmm, that was a little to late, I've implemented now the whole matrix :D But I'm not yet sure about the four elements which are zero in the matrix above :thinking: Is there no way they could be useful?

I'd guess it's good to have the two off-diagonal in case you use a bent modulator?

Are you using the python or the julia version? I've now implemented it in the julia version, currently in CICD-checking

DorisReiter commented 1 year ago

great to have the full isotropic matrix onboard. I need to update the documentation soon.

HelgeGehring commented 1 year ago

There's now an example online in https://helgegehring.github.io/femwell/julia/waveguide_anisotropic.html It doesn't match exactly the numbers in the paper, but they used finite-difference with a rather corse grid, so I think it's fine that only the first digits match, we're probably more accurate :)

@ledezmaluism could you doublecheck that?

Yes, that tensor is more than enough!

In photonics, typically the direction of propagation is orthogonal to one of the principal axes of the crystal. This is guaranteed in photonic integrated circuits since the surface of the chip is normal to one of the principal axes.

Furthermore, most of the time people place their waveguides along another of the principal axes of the crystal, so the matrix becomes diagonal (ϵxy=0). I've been simulating these for years and have only ever needed diagonal matrices, so even that would be enough for most applications!

@ledezmaluism could you add a bit about that to the docs? Would be amazing to explain a bit why a tensor is useful :)

@DorisReiter yay, thanks :)

Localidol commented 1 year ago

This is awesome! Just two quick questions: Is there any chance there will be a Python version of the current example? And can this code be combined with other features, such as the Coulomb solver?

HelgeGehring commented 1 year ago

Yay, thanks for the feedback, happy to hear that :)

Right now I don't see yet a clear way to integrate this in the python version, as I don't see a way to provide epsilon as a matrix using the ElementTriP0/P1. I'll have a closer look.

On the other hand, extending the current example to use the coulomb solver isn't a big deal :)

@Localidol, would you have a paper we can reproduce which uses the anisotropic indices with the coulomb solver?

Localidol commented 1 year ago

Understood. I will then implement Julia in my workflow, waiting for a possible Python implementation. :)

@HelgeGehring You could use the example of the Lithium Niobate you used previously.

EDIT: I see I'm already too late. Thank you. This is awesome!

HelgeGehring commented 1 year ago

Always happy to help :)

@Localidol would be amazing if you could report how it compares to previous simulations you did / experiments.

Also, it would be just great to have a bit more explanations in that example. Could you maybe add a bit, I think you're that deep in that topic, that it would be super easy for you to explain it a bit :)

It would also be great to add something that actually uses the anisotropic mode solver. Do I already need it in this example? Or would we have to adjust the experiment we simulate?

bernwo commented 3 months ago

Hi, has there been any progress on the anisotropic epsilon implementation for Python?

HelgeGehring commented 3 months ago

Not yet, I'm happy to review a pull request and give some tips how to implement it :)