Различия

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

ru:tutorial [2012/08/28 23:28]
deinega [Total Field / Scattered Field]
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>
Строка 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
Строка 738: Строка 717:
 //  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(100,1);   task.SetOblique(100,1);
 
/home/kintechlab/fdtd.kintechlab.com/docs/data/attic/ru/tutorial.1346182128.txt.gz · Последние изменения: 2012/08/28 23:28 — deinega     Наверх