Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

ru:tutorial [2012/07/23 08:10]
deinega [Наклонное падение]
ru:tutorial [2014/01/11 06:04] (текущий)
deinega [Наклонное падение]
Строка 33: Строка 33:
 ======Геометрические тела====== ======Геометрические тела======
  
-Ниже мы вкратце перечислим классы, отвечающие некоторым используемым геометрическим телам. Со всем списком можно ознакомиться в справке для пользователя. +Как создавать геометрические тела описано [[/ru/ivutils#geometricheskie_tela|здесь]].
- +
-Класс вектор Vector_3. В его конструкторе задаются три координаты x, y и z. Вектора можно складывать, вычитать, умножать на число, умножать скалярно (с помощью оператора *) и векторно (с помощью оператора %). Например, +
- +
-<code cpp> +
-  Vector_3 v1(1,0,0),v2(0,1,0); +
-  Vector_3 v0=a%b-Vector_3(0,0,1); // v0 равен Vector_3(0,0,0) +
-</code> +
- +
-Если в конструкторе вектора задается меньше трех координат, то незаданные координаты полагаются равными последней заданной. Например, Vector_3(1)=Vector_3(1,1,1). Также Vector_3()=Vector_3(0,0,0), так как первая координата по умолчанию равна нулю. +
- +
-Векторам с целочисленными координатами отвечает класс iVector_3. +
-   +
-Прямоугольный параллелепипед, ребра которого параллельны координатным осям, задается путем указания левого нижнего и правого верхнего векторов. +
- +
-<code cpp> +
-  Box b(Vector_3(),Vector_3(1)); // единичный куб b +
-</code> +
- +
-Сфера задается путем указания ее радиуса и центра. +
- +
-<code cpp> +
-  Sphere s(1,Vector_3()); // сфера s радиуса 1, центр которой находится в начале координат +
-</code> +
- +
-Также имеются многогранник, цилиндр и пирамида с основанием в виде произвольного многоугольника. Тела можно растягивать, поворачивать, брать их пересечения и объединения. Гладкие тела, например конус, можно конструировать как многогранники с большим количеством граней.+
  
 Если тела выходят за границы вычислительного объема, то рассматривается только та их часть, которая в него попадает. Если тела выходят за границы вычислительного объема, то рассматривается только та их часть, которая в него попадает.
Строка 185: Строка 160:
 Форма Беренгера выглядит так: Форма Беренгера выглядит так:
  
-<tex>E(t) = E_0 (t-t_0) \exp \left[ \left(\frac{t-t_0}{t_w} \right)^2 \right] </tex>, <tex>\left|t-t_0\right| \le T</tex>+<tex>E(t) = E_0 (t-t_0) \exp \left[ -\left(\frac{t-t_0}{t_w} \right)^2 \right] </tex>, <tex>\left|t-t_0\right| \le T</tex>
  
 <tex>E(t) = 0</tex>, <tex> \left|t-t_0\right| > T </tex> <tex>E(t) = 0</tex>, <tex> \left|t-t_0\right| > T </tex>
  
-В нашем примере <tex>E_0=1</tex>,<tex>t_0=25</tex>,<tex>t_w=5</tex>,<tex>T=25</tex>+В нашем примере <tex>E_0=1</tex>,<tex>t_0=25</tex>,<tex>t_w=5</tex>,<tex>T=125</tex>
  
 =====Детекторы===== =====Детекторы=====
Строка 576: Строка 551:
   M.AddPolarizability(emLorentz(.5*(2*M_PI), .1*(2*M_PI), 2*1e-5));   M.AddPolarizability(emLorentz(.5*(2*M_PI), .1*(2*M_PI), 2*1e-5));
  
-  task.AddObject(M,GetPolyhedronPlate(Vector_3(0,0,1),Vector_3(0,0,1),1));+  task.AddObject(M,GetPlate(Vector_3(0,0,1),Vector_3(0,0,1),1));
  
-Пластинка задается функцией GetPolyhedronPlate, первый аргумент которой задает направление вдоль пластинки (направление z), второй точку, через которую проходит одна из сторон пластинки, а третий - толщину пластинки (она равна 1).+Пластинка задается функцией GetPlate, первый аргумент которой задает направление вдоль пластинки (направление z), второй точку, через которую проходит одна из сторон пластинки, а третий - толщину пластинки (она равна 1).
 Пластинка сделана из дисперсной среды, описываемой двумя членами Лоренца. Пластинка сделана из дисперсной среды, описываемой двумя членами Лоренца.
  
Строка 594: Строка 569:
  
 Поглощение может быть получено как 1 - R - T. Поглощение может быть получено как 1 - R - T.
 +
 +Расстояние между телами, границей TF/SF, PML и детекторами должно быть не менее 2 сеточных шагов. В нашем примере мы придерживались большего расстояния (5-20 сеточных шагов), поскольку иногда это может улучшить результат.
  
 =====Кремниевая подложка===== =====Кремниевая подложка=====
Строка 599: Строка 576:
 Ниже мы рассчитываем отражение от полубесконечной кремниевой подложки в случае нормального падения. Мы используем уже имеющийся код из предыдущей подсекции (задание граничных условий, области Total Field и т. д.) Ниже мы рассчитываем отражение от полубесконечной кремниевой подложки в случае нормального падения. Мы используем уже имеющийся код из предыдущей подсекции (задание граничных условий, области Total Field и т. д.)
  
-Для задания полубесконечной подложки мы можем воспользоваться функцией GetPolyhedronPlane. В отличие от пластинки, у подложки нет второй замыкающей поверхности, и она бесконечно продолжается вдоль оси z. В модели FDTD она погружается в PML, что моделирует ее бесконечность.+Для задания полубесконечной подложки мы можем воспользоваться функцией GetHalfSpace. В отличие от пластинки, у подложки нет второй замыкающей поверхности, и она бесконечно продолжается вдоль оси z. В модели FDTD она погружается в PML, что моделирует ее бесконечность.
  
 Материалом подложки будет кремний. Для получения соответствующего объекта emMedium можно воспользоваться функцией getSi, у которой имеется аргумент, по умолчанию равный единице. Этот аргумент задает, чему равна единица длины FDTD в микронах. Это необходимо для правильной калибровки коэффициентов, участвующих в расчете диэлектрической проницаемости (см. [[tutorial?&#sredy|как задавать среды в EMTL]]). В нашем случае единица FDTD будет равна 0.1 микрона. Материалом подложки будет кремний. Для получения соответствующего объекта emMedium можно воспользоваться функцией getSi, у которой имеется аргумент, по умолчанию равный единице. Этот аргумент задает, чему равна единица длины FDTD в микронах. Это необходимо для правильной калибровки коэффициентов, участвующих в расчете диэлектрической проницаемости (см. [[tutorial?&#sredy|как задавать среды в EMTL]]). В нашем случае единица FDTD будет равна 0.1 микрона.
  
-  task.AddObject(getSi(.1),GetPolyhedronPlane(Vector_3(0,0,1), Vector_3(0,0,1)));+  task.AddObject(getSi(.1),GetHalfSpace(Vector_3(0,0,1), Vector_3(0,0,1)));
      
 Параметры, используемые для апроксимации диэлектрической проницаемости кремния функцией getSi, были получены с помощью программы на MatLab, которую вы можете найти в разделе [[fitting]]. Параметры, используемые для апроксимации диэлектрической проницаемости кремния функцией getSi, были получены с помощью программы на MatLab, которую вы можете найти в разделе [[fitting]].
Строка 619: Строка 596:
  
 Как видно, кремний достаточно сильно отражает в оптическом диапазоне. Для уменьшения отражения могут использоваться [[ar|антиотражающие текстурированные покрытия]]. Как видно, кремний достаточно сильно отражает в оптическом диапазоне. Для уменьшения отражения могут использоваться [[ar|антиотражающие текстурированные покрытия]].
- 
 =====Наклонное падение===== =====Наклонное падение=====
  
Строка 628: Строка 604:
 Для управления итерационным процессорм используется метод Total Field/Scattered Field (TF/SF). Для управления итерационным процессорм используется метод Total Field/Scattered Field (TF/SF).
 Спустя некоторое число итераций граница TF/SF работает как применение периодических граничных условий с нужным сдвигом во времени. Спустя некоторое число итераций граница TF/SF работает как применение периодических граничных условий с нужным сдвигом во времени.
 +
 +Наш метод описан в статье
 +[[http://www.opticsinfobase.org/abstract.cfm?uri=ol-33-13-1491|http]]{{:valuev_-_iterative_technique_for_analysis_of_periodic_structures_at_oblique_incidence_in_the_finite-difference_time-domain_method.pdf|PDF}}
  
 {{tutorial_periodic:geometry_obl.png?350}}\\ {{tutorial_periodic:geometry_obl.png?350}}\\
Строка 675: Строка 654:
 //  Vector_3 E(0,cos(theta),-sin(theta)); // p polarization //  Vector_3 E(0,cos(theta),-sin(theta)); // p polarization
  
-  task.AddTFSFPlane(VEC_INFTY,VEC_INFTY,.5);+  task.AddTFSFPlane(INF,INF,.5);
   task.SetPlaneWave(k,E);   task.SetPlaneWave(k,E);
   task.SetOblique(10,1); // comment it for normal incidence   task.SetOblique(10,1); // comment it for normal incidence
Строка 716: Строка 695:
  
 =====Фотонно-кристаллическая пластинка===== =====Фотонно-кристаллическая пластинка=====
 +
 +Фотонно-кристаллическая пластинка это структура конечная вдоль одного направления и периодическая вдоль остальных направлений.
 +Ниже мы моделируем наклонное падение на такую пластинку состояющую из металлических (<tex>\epsilon=4</tex>, <tex>\sigma=2</tex>) сфер упакованных в квадратную решетку. 
 +Период решетки <tex>a=1</tex>, радиус сфер <tex>R=0.375</tex>, сеточный шаг равен 0.025.
 +
 +<code cpp>
 +#include "uiexp.h"
 +
 +int main(int argc,char **argv){
 +
 +  emInit(argc,argv);
 +
 +  uiExperiment task;
 +  task.SetInternalSpace(0,Vector_3(1,1,3));
 +  task.SetResolution(.025);
 +  task.SetBC(BC_PER,BC_PER,BC_PML);
 +
 +  valtype theta=45*M_PI/180.; // angle of incidence, radians. theta=0 corresponds to normal incidence
 +  Vector_3 k(0,sin(theta),cos(theta));
 +  Vector_3 E(1,0,0); // s polarization
 +//  Vector_3 E(0,cos(theta),-sin(theta)); // p polarization
 +
 +  task.AddTFSFPlane(INF,INF,.5);
 +  task.SetPlaneWave(k,E);
 +  task.SetOblique(100,1);
 +
 +  task.AddObject(emMedium(4,2),new Sphere(.375,Vector_3(.5,.5,1.5)));
 +
 +  task.AddDetectorSet("h",Vector_3(.5,.5,0.25),Vector_3(.5,.5,2.75),iVector_3(1,1,2));
 +  task.AddRTASet("flux",2,0.25,2.75);
 +
 +  task.CalculateN(2000);
 +
 +  task.Analyze();
 +
 +  return 0;
 +}
 +</code>
 +
 +Посмтроим геометрию в gnuplotе:
 +
 +  gnuplot> sp 'cell.pol' w l, 'med.pol' w l, 'pmlo.pol' w l, 'pmli.pol' w l, \
 +  gnuplot> 'tf.pol' w l, 'sg.vec' w vec, 'itf.pol' w l, 'unit.pol' w l
 +
 +{{tutorial_periodic:obl_gnu.png?350}}\\
 +
 +Согласно картинке выше, 'itf.pol' соответствует границам 1 и 2, а 'unit.pol' соответствует периодической ячейке ширины a (она ограничена границей между 1 and 2' и границей между 1' и 2).
 +
 +Сравним результаты для спектра прохождения, полученные с помощью FDTD и полуаналитического метода layer Korringa-Kohn-Rostoker (LKKR).
 +
 +{{tutorial_periodic:obl_pc_trans.png?450}}\\
 +
 +Как можно видеть из сравнения, результаты для больших частот сходятся быстрее.
 +При этом 5-10 итераций достаточно для получения спектра прохождения с нормальной точностью.
 +Для окончательной сходимости метода в нашем случае требуется порядка 100 итераций.
 +Вообще, число итераций, необходимое для сходимости метода, пропорционально числу временных шагов в численном эксперименте (в нашем примере это 2000).
 +
 ======Радиационное затухание источника====== ======Радиационное затухание источника======
  
  
 
/home/kintechlab/fdtd.kintechlab.com/docs/data/attic/ru/tutorial.1343016651.txt.gz · Последние изменения: 2012/07/23 08:10 (внешнее изменение)     Наверх