Metody Obliczeniowe Mikrooptyki i Fotoniki Podstawy programu Meep (interfejs pythonowy i scheme) Metoda FDTD c.d. - nieciągłości przenikalności elektrycznej, dyspersja M. N. Sadiku, Numerical Techniques in Electromagnetics 2nd Ed., CRC Press 2001 A. Taflove, S. Hagnes Computational Electrodynamics The Finite-Difference Time Domain Method, Artech House, 2005
Metody Obliczeniowe Mikrooptyki i Fotoniki Program MEEP (>ver. 1.4) (interfejs w pythonie; elementy języka Scheme) https://meep.readthedocs.io/en/latest/ Complete scriptability via Python, Scheme, or C++ APIs.
Program MEEP Meep (or MEEP) is a free finite-difference time-domain (FDTD) simulation software package developed at MIT to model electromagnetic systems, along with our MPB eigenmode package. Its features include: Free software under the GNU GPL. Simulation in 1d, 2d, 3d, and cylindrical coordinates. Distributed memory parallelism on any system supporting the MPI standard. Portable to any Unix-like system Arbitrary anisotropic electric permittivity ε and magnetic permeability μ, along with dispersive ε(ω) and μ(ω) (including loss/gain) and nonlinear (Kerr & Pockels) dielectric and magnetic materials, and electric/magnetic conductivities σ. PML absorbing boundaries and/or perfect conductor and/or Bloch-periodic boundary conditions. Exploitation of symmetries to reduce the computation size even/odd mirror symmetries and 90 /180 rotations. Complete scriptability either via a Scheme scripting front-end (as in libctl and MPB), or callable as a C++ library; a Python interface is also available. Field output in the HDF5 standard scientific data format, supported by many visualization tools. Arbitrary material and source distributions including a guided-mode launcher. Frequency-domain solver for finding the response to a continuous-wave source. Field analyses including flux spectra, near to far field transformations, modal depcomposition, frequency extraction, local density of states, modal volume, Maxwell stress tensor, arbitrary functions; completely programmable. Meep officially stands for MIT Electromagnetic Equation Propagation http://ab-initio.mit.edu/wiki/index.php/meep
Logowanie na klaster: Uruchomienie spydera (interfejs pythonowy): ssh -X -p10024 momif1@ssh-gate.igf.fuw.edu.pl spyder Kopiowanie plików: scp -r -P10024 momif1@ssh-gate.igf.fuw.edu.pl:katalog./katalog scp -r -P10024./katalog momif1@ssh-gate.igf.fuw.edu.pl./katalog Wywołanie bezpośrednie (interfejs scheme): plik wejściowy (Scheme) -bash-3.00$ Wyniki meep foo.ctl >& foo.out Przy dłuższych symulacjach warto użyć poleceń screen i nice / renice W wersji interaktywnej: -bash-3.00$ meep meep> interpreter poleceń scheme meep> (exit) zakończenie pracy
Jednostki w meepie Równania Maxwella w jednostkach znormalizowanych μ 0=1, ϵ 0=1, c =1 Można przyjąć dowolną jednostkę długości (np. a=1 nm). Jeśli jednak używamy predefiniowanych materiałów, to ze względu na dyspersję trzeba określić jednostkę długości i domyślnie jest nią a=1um. Inne jednostki: Jednostki długości (np. długość fali): x [a], Jednostki czasu (podaje się w jednostkach długości): t[a/c] Jednostki częstości: f [c/a] (czyli liczbowo f=1/λ), ω [2πc/a]
Interfejs meepa w pythonie https://meep.readthedocs.io/en/latest/python_user_interface/#python-user-interface https://meep.readthedocs.io/en/latest/python_tutorials/basics/ (Fragmenty tutoriala) Import modułu pythona: import meep as mp Określamy rozmiar obszaru symulacji (w jednostkach umownych): cell = mp.vector3(16, 8, 0) Tworzymy listę obiektów w obszarze symulacji: geometry = [mp.block(mp.vector3(1e20, 1, 1e20), center=mp.vector3(0, 0), material=mp.medium(epsilon=12))] Tworzymy listę prądowych źródeł pola: sources = [mp.source(mp.continuoussource(frequency=0.15), component=mp.ez, center=mp.vector3(-7,0))]
Przedstawienie graficzne wyników symulacji Import modułów numy i matplotlib pythona: import numpy as np import matplotlib.pyplot as plt Zobrazowanie zdefiniowanego rozkładu przenikalności elektrycznej: eps_data = sim.get_array(mp.vector3(), cell, mp.dielectric) plt.figure(dpi=100) plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary') plt.axis('off') plt.show() Zobrazowanie końcowego rozkładu pola elektrycznego: ez_data = sim.get_array(mp.vector3(), cell, mp.ez) plt.figure(dpi=100) plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary') plt.imshow(ez_data.transpose(), interpolation='spline36', cmap='rdbu', alpha=0.9) plt.axis('off') plt.show()
Interfejs meepa w pythonie Określamy grubość warstwy PML: pml_layers = [mp.pml(1.0)] Określamy rozdzielczość siatki (liczba punktów na jednostkę długości) resolution = 10 Tworzymy obiekt opisujący symulację: sim = mp.simulation(cell_size=cell, boundary_layers=pml_layers, geometry=geometry, sources=sources, resolution=resolution) Uruchamiamy symulację sim.run(until=200)
Zapisywanie pola w trakcie symulacji Zapisywanie przenikalności elektrycznej i pośrednich rozkładów pola do plików sim.run(mp.at_beginning(mp.output_epsilon), mp.to_appended("ez",mp.at_every(0.6,mp.output_efield_z)), until=200) Zapisywanie i przetwarzanie fragmentu pola w pamięci w trakcie symulacji Vals = [] def get_slice(sim): center = mp.vector3(0, -3.5) size = mp.vector3(16, 0) vals.append(sim.get_array(center=center, size=size, component=mp.ez)) sim.run( mp.at_beginning(mp.output_epsilon), mp.at_every(0.6, get_slice), until=200 ) plt.figure(dpi=100) plt.imshow(vals, interpolation='spline36', cmap='rdbu') plt.axis('off') plt.show()
Materiały dyspersyjne https://meep.readthedocs.io/en/latest/materials/ https://meep.readthedocs.io/en/latest/python_tutorials/material_dispersion/ Przykład: susceptibilities = [mp.lorentziansusceptibility(frequency=1.1, gamma=1e-5, sigma=0.5), mp.lorentziansusceptibility(frequency=0.5, gamma=0.1, sigma=2e-5)] default_material = mp.medium(epsilon=2.25,e_susceptibilities=susceptibilities)
Metale Biblioteka materiałowa z metalami https://github.com/stevengj/meep/blob/master/python/examples/materials_library.py A.D. Rakic et al., Applied Optics, Vol. 37, No. 22, pp. 5271-83 (1998) import sys sys.path.insert(0, '/path/to/materials_library.py') from materials_library import * Predefiniowane materiały: Ag, Au, Cu, Al, Be, Cr, Ni, Pd, Pt, Ti, W
Wektor Poyntinga i gęstość energii https://meep.readthedocs.io/en/latest/synchronizing_the_magnetic_and_electric_fields/ Synchronizacja pól (run-until 200 (synchronized-magnetic output-poynting output-tot-pwr)) Dodatkowa opcjonalna i przy częstym obliczaniu kosztowna numerycznie synchronizacja czasowa pola elektrycznego i magnetycznego pozwala zminimalizować wpływ próbkowania tych pól w różnych chwilach czasu.
Wygładzanie stałych materiałowych TE TE Pole E ciągłe C=C 1 C 2 TM m f 1 1 f 2 2 TM Pole D ciągłe 1 1 1 C =C 1 C 2 1 1 1 m f 1 1 f 2 2 f- procent objętości każdego z dielektryków f f =1 1 2 D. E. Aspnes, Local field effects and effective medium theory: a microscopic perspective Am J. Phys 50, 704 (1982)
Wygładzanie stałych materiałowych TE TE m f 1 1 f 2 2 TM TM 1 1 1 m f 1 1 f 2 2 R.Meade, A. Rappe, K. Brommer, J. Joannopoulos Accurate theoretical analysis of photonic band-gap materials, Phys. Rev B, 48 (1993)
Wygładzanie stałych materiałowych TE TE m f 1 1 f 2 2 Anizotropowy efektywny tensor przenikalności dielektrycznej: Składowe wektora normalnego TE TM Tensor Levi-Civita TM [ m ]i, j m n i n j m e kjl enli n k n n mamy: Dla n= x TM [ TE m 0 0 m = 0 m TM 0 0 0 TM m 1 1 1 m f 1 1 f 2 2 ] R.Meade, A. Rappe, K. Brommer, J. Joannopoulos Accurate theoretical analysis of photonic band-gap materials, Phys. Rev B, 48 (1993)
FDTD materiały dyspersyjne, metoda równania pomocniczego (ADE) (ADE- auxiliary differential equation) Prawo Ampera dla ośrodka dyspersyjnego: D E H= J = E 0 p J p t t J p t P p t t Zapis zespolony J p =i P p =i 0 p E
FDTD materiały dyspersyjne, metoda równania pomocniczego (ADE) (ADE- auxiliary differential equation) Prawo Ampera dla ośrodka dyspersyjnego: E H= E 0 p J p t J p t P p t t Zapis zespolony J p =i P p =i 0 p E Model Lorentza: 2 p= 0, p 2 0, p 2 i p = p p 2 J p = i 0, p 0 2 0, p 2 i p E
FDTD materiały dyspersyjne, metoda równania pomocniczego (ADE) 2 2 2 0, p i p J p =i 0, p 0 E IFT Równanie pomocnicze (ADE): 2 E t 20, p 2 p J p t = 20, p 0 t t t
FDTD materiały dyspersyjne, metoda równania pomocniczego (ADE) Prawo Ampera: Równanie pomocnicze (ADE): E H= E 0 p J p t 2 E t 2 2 p J p t = 0, p 0 t t t 2 0, p Dyskretyzacja E i J w tych samych punktach n 1 2 n 0, p J p n n 1 J p 2J p J p t 2 n 1 p n 1 J p Jp t 2 = 0, p 0 E n 1 E 2 t n [ H n 1/ 2 Otrzymujemy schemat: E n 1,E, Jp, Jp,H E n 1, E, J p, J p J p E n 1 n n 1 n n 1/ 2 n n 1 n n 1 H n 3/ 2 E n 1 ]i = p n 1 n J p J p 2
Język SCHEME http://pl.wikipedia.org/wiki/scheme http://en.wikipedia.org/wiki/scheme_%28programming_language%29
Język SCHEME Definicja zmiennej: (define var1 value) Definicja zmiennej lokalnej: (let ((var1 value))... ; scope of var1...) Zmiana wartości zmiennej: (set! var1 value) Działania arytmetyczne: (+ var1 value) (- var1 value) (* var1 value) (/ var1 value) Komentarz
Język SCHEME
Język SCHEME Funkcje Definicja funkcji: (define (fun arg1 arg2...)...) Wywołanie funkcji: (fun value1 value2) albo (apply fun (list value1 value2))
Język SCHEME Definicja listy: (list value1 value2 value3...) Listy można zagnieżdżać: (list value1 (list value2 value3) value4) Pierwszy element listy: (car list1) Reszta listy: (cdr list1) Sklejanie list: (const list1 list2)
Język SCHEME
Język SCHEME
Język SCHEME
Funkcje i rekurencja
Pętle i rekurencja ogonkowa
Język SCHEME
Proste konstrukcje w Scheme i C Scheme (+ 2 3 4) C (2 + 3 + 4) (< low x high) ((low < x) && (x < high)) (+ (* 2 3) (* 4 5)) ((2 * 3) + (4 * 5)) (f x y) f(x, y) (define (sq x) (* x x)) int sq(int x) {return ( x * x ) }
Biblioteka libctl http://ab-initio.mit.edu/wiki/index.php/libctl_manual Obiekty (struktury) Obiekt zawiera zbiór własności, którym można przypisać wartości: (make type (property1 value1) (property2 value2)...) Wektorowy typ danych: Vector3 jest trójelementową tablicą: (vector3 x [y [z]]) Odwołanie do elementu wektora: (vector3-x v) (vector3-y v) (vector3-z v Operacje na wektorach: (vector3* a b) (vector3- a b) (vector3+ a b) (vector3-cross v1 v2) (vector3-norm v)
Propagacja fali w falowodzie http://ab-initio.mit.edu/wiki/index.php/meep_tutorial PML
Propagacja fali w falowodzie h5topng -S3 eps-000000.00.h5 h5topng -S3 -Zc dkbluered -a yarg -A eps-000000.00.h5 ez-000200.00.h5
A 90 bend http://ab-initio.mit.edu/wiki/index.php/meep_tutorial
Wizualizacja pliku hdf5 h5dump test-ez.h5 more HDF5 "test-ez.h5" { GROUP "/" { DATASET "ez" { DATATYPE H5T_IEEE_F64LE DATASPACE SIMPLE { ( 160, 160, 333 ) / ( 160, 160, H5S_UNLIMITED ) } DATA { (0,0,0): 0, 0, 0, 0, -7.00012e-17, -1.16823e-11, -1.24473e-09, (0,0,7): -6.3356e-10, 1.44236e-10, 4.46978e-10, 9.36788e-10,...
Wczytywanie plików wyjściowych w Matlabie
Meep + C++ http://ab-initio.mit.edu/wiki/index.php/meep_c-plus-plus_tutorial