Распространение радиоволн ВЧ/Рей-трейсинг: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
 
(не показано 20 промежуточных версий 2 участников)
Строка 60: Строка 60:
::<math>\frac{dn}{dh}=grad~n</math> - изменение коэффициента преломления с высотой.
::<math>\frac{dn}{dh}=grad~n</math> - изменение коэффициента преломления с высотой.
:<math>r=\sqrt{x^{2}+y^{2}}</math> - расстояние до точки с высотой <math>h(x,y)</math>.
:<math>r=\sqrt{x^{2}+y^{2}}</math> - расстояние до точки с высотой <math>h(x,y)</math>.


==Основной цикл программы | Вариант 1==
==Основной цикл программы | Вариант 1==
Строка 109: Строка 108:


==Основной цикл программы | Вариант 2==
==Основной цикл программы | Вариант 2==
'''Геометрическая модель (рей-трейсинг 2)'''.
''Наследует свойства [[Распространение радиоволн ВЧ/Геометрическая модель|Геометрической модели]].''
* Предикат завершения(). При <math>i = 0</math> возвращает истину, иначе возвращает значение функции SubApprox для результатов моделирования не предыдущем и на текущем этапах, а также для включаемого отклонения <math>\Delta</math> и допустимого процента точек <math>k</math>.
===Предусловия===
===Предусловия===
* <math>G</math> - входное описание среды распространения моделируемого поля, заданное [[Распространение радиоволн ВЧ/Геометрическая модель|геометрической моделью]].
* <math>G</math> - входное описание среды распространения моделируемого поля, заданное [[Распространение радиоволн ВЧ/Геометрическая модель|геометрической моделью]].
* <math>\Omega</math> - список частот, на которых необходимо провести моделирование.
* <math>E_{end}</math> - критическое значение напряженности, на котором дальнейшая трассировка луча прекращается.
* <math>E_{end}</math> - критическое значение напряженности, на котором дальнейшая трассировка луча прекращается.
* <math>\Delta</math> - максимальная разность между текущим и предыдущим результатом моделирования, при которой можно считать, что поле промоделированно точно.
* <math>\Delta</math> - критерий разности между текущим и предыдущим результатом моделирования, при которой можно считать, что поле промоделированно точно.


===Основное течение===
===Основное течение===
#<math>\forall ~ \omega_n \in \Omega</math>
##<math>i \leftarrow 0</math>
##Pre_SCP <math> \leftarrow</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]]</tt> ''//Копирование состояния до изменения''.
##Set_event <math>\leftarrow</math><tt> Preprocessing(<math>G,~i,~\omega_n</math>)</tt>
##<math>\forall ~ (s_j,~\theta,~\varphi) \in </math> Set_event
###Ray <math>\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Луч|Луч()]].Создать([[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]], <math>\theta,~\varphi,~\omega_n</math>)</tt>
###<tt>Trace(Ray, [[Распространение радиоволн ВЧ/Геометрическая модель|G]], <math>E_{end}</math>)</tt>
##<tt>Postprocessing([[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]])</tt>
##SAcheck <math>\leftarrow</math><tt> SucApprox([[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]], Pre_SCP, <math>\Delta</math>)</tt>
##Если SAcheck
###<math>i \leftarrow i+1</math>
###Переход на 1.2
#ВЫХОД
===<tt>[Таблица событий] <math>\leftarrow</math> Preprocessing(Геометрическая модель, Номер итерации, Частота)</tt>===
Функция создает таблицу событий, необходимых обработать. В качестве событий - испускаемые моделью лучи на данной частоте.
#<math>T \leftarrow</math> Пустой односвязный список значений <math>(s_j,~\theta,~\varphi)</math>.
#<math>G \leftarrow</math> Геометрическая модель.
#<math>i \leftarrow</math> Номер итерации
#<math>\omega \leftarrow</math> Частота
#<math>\forall ~ s_j \in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Первичный источник|Множество первичных источников()]]</tt>
##Если <tt> [[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].[[Распространение радиоволн ВЧ/Антенна|Антенна()]].[[Распространение радиоволн ВЧ/Тип антенны|Тип антенны()]].[[Распространение радиоволн ВЧ/Амплитудно-частотная характеристика|Амплитудно-частотная характеристика(<math>\omega</math>)]]</tt> <math>\ne 0</math>
###<math>\theta \leftarrow 0</math>
###<math>\zeta_{\theta} \leftarrow 0</math>
###Пока <math>\theta < \pi</math>
####<math>\varphi \leftarrow 0</math>
####<math>\zeta_{\varphi} \leftarrow 0</math>
####Пока <math>\varphi<2\pi</math>
#####Если <math>i=0 \vee \zeta_{\theta} \bmod 2 \neq 0 \vee \zeta_{\varphi} \bmod 2 \neq 0</math>
######<math>T</math>.Добавить<math>(s_j,~\theta,~\varphi)</math>
#####<math>\varphi \leftarrow \varphi + \frac{\Delta_{\varphi} (s_j,~\theta,~\varphi)}{2^i}</math>
#####<math>\zeta_{\varphi} \leftarrow \zeta_{\varphi}+1</math>
####<math>\theta \leftarrow \theta + \frac{\Delta_{\theta} (s_j,~\theta)}{2^i}</math>
####<math>\zeta_{\theta} \leftarrow \zeta_{\theta}+1</math>
#Вернуть Массив(<math>T</math>)
Если <math>\Delta_{\varphi} (s_j,~\theta,~\varphi) = {\rm const}</math>, и <math>\Delta_{\theta} (s_j,~\theta) = {\rm const}</math>, то есть углы распределены равномерно, таблица может быть реализована в виде массива значений <math>(s_j,~\theta,~\varphi)</math>, элементы которого могут заполняться параллельно, без синхронизации. Если же размер таблицы заранее не определен (общий случай), то таблица реализуется связанным списком, добавление элементов в который должно защищаться мьютексом на шаге 4.1.3.1.3.1.1, а алгоритм на заключительном шаге преобразует связанный список в массив с произвольным доступом. Второй путь при параллельном выполнении - создавать таблицы в локальной памяти потока, после выполнения которых - объединять таблицы в массив в основном потоке.
====Параллельная форма====
Параллельное выполнение в общем случае возможно только цикла, перебирающего первичные источники (шаг 4), так как распределение углов заранее не определено.
Пусть <math>P>0</math> - число потоков, выполняющих функцию. Пусть <math>T'</math> -  массив изначально пустых связанных списков троек <math>(s_j,~\theta,~\varphi)</math>, так, что <math>T'_i</math> - <math>i</math>-тый список массива, <math>0\le i<P</math>.
#<math>i \leftarrow</math> Номер итерации
#<math>\omega \leftarrow</math> Частота
#<math>T'\leftarrow</math>Создать массив.
#<math>\forall ~ s_j \in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Первичный источник|Множество первичных источников()]]</tt>
#<math>\forall ~ s_j \in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Первичный источник|Множество первичных источников()]]</tt>
##<math>\forall ~ \omega_n \in</math><tt> [[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].[[Распространение радиоволн ВЧ/Антенна|Антенна()]].[[Распространение радиоволн ВЧ/Тип антенны|Тип антенны()]].[[Распространение радиоволн ВЧ/Амплитудно-частотная характеристика|Амплитудно-частотная характеристика()]]</tt>
##<math>t\leftarrow</math> индекс потока.
###<math>i \leftarrow 0</math>
##Если <tt> [[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].[[Распространение радиоволн ВЧ/Антенна|Антенна()]].[[Распространение радиоволн ВЧ/Тип антенны|Тип антенны()]].[[Распространение радиоволн ВЧ/Амплитудно-частотная характеристика|Амплитудно-частотная характеристика(<math>\omega</math>)]]</tt> <math>\ne 0</math>
###<tt>Множество контрольных точек(-1) </tt><math>\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]]</tt>
###<math>\theta \leftarrow 0</math>
###<math>\theta \leftarrow 0</math>
###<math>\zeta_{\theta} \leftarrow 0</math>
###<math>\zeta_{\theta} \leftarrow 0</math>
###Пока <math>\theta < \pi</math>
###Пока <math>\theta < \pi</math>
####Если <math>i=0 \vee \zeta_{\theta} \bmod 2 \neq 0</math>
####<math>\varphi \leftarrow 0</math>
#####<math>\varphi \leftarrow 0</math>
####<math>\zeta_{\varphi} \leftarrow 0</math>
#####<math>\zeta_{\varphi} \leftarrow 0</math>
####Пока <math>\varphi<2\pi</math>
#####Пока <math>\varphi<2\pi</math>
#####Если <math>i=0 \vee \zeta_{\theta} \bmod 2 \neq 0 \vee \zeta_{\varphi} \bmod 2 \neq 0</math>
######Если <math>i=0 \vee \zeta_{\varphi} \bmod 2 \neq 0</math>
######<math>T'_t</math>.Добавить<math>(s_j,~\theta,~\varphi)</math>
#######Ray <math>\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Луч|Луч()]].Создать([[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]], <math>(\theta,~\varphi),~\omega_n</math>)</tt>
#####<math>\varphi \leftarrow \varphi + \frac{\Delta_{\varphi} (s_j,~\theta,~\varphi)}{2^i}</math>
#######<tt>Trace(Ray, [[Распространение радиоволн ВЧ/Геометрическая модель|G]], <math>E_{end}</math>)</tt>
#####<math>\zeta_{\varphi} \leftarrow \zeta_{\varphi}+1</math>
######<math>\varphi \leftarrow \varphi + \frac{\Delta_{\varphi} (\theta, \varphi)}{2^i}</math>
####<math>\theta \leftarrow \theta + \frac{\Delta_{\theta} (s_j,~\theta)}{2^i}</math>
######<math>\zeta_{\varphi} \leftarrow \zeta_{\varphi}+1</math>
####<math>\theta \leftarrow \theta + \frac{\Delta_{\theta} (\theta)}{2^i}</math>
####<math>\zeta_{\theta} \leftarrow \zeta_{\theta}+1</math>
####<math>\zeta_{\theta} \leftarrow \zeta_{\theta}+1</math>
###<tt>Postprocessing([[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]])</tt>
#Вернуть Массив<math>\left(\bigsqcup_{t=0}^{P-1}T'_t\right)</math>
###SAcheck <math>\leftarrow</math><tt> SucApprox([[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]], Множество контрольных точек(-1), <math>\Delta</math>)</tt>
###Если SAcheck
####<tt>Множество контрольных точек(-1) </tt><math>\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек(<math>\omega_n</math>)]]</tt>
####<math>i \leftarrow i+1</math>
####Переход на 1.1.3
#ВЫХОД


===<tt>Trace</tt>===
===<tt>Trace</tt>===
Функция трассирует луч через геометрическую модель и и фиксирует его прохождение вблизи контрольной точки.
Функция трассирует луч через геометрическую модель и и фиксирует его прохождение вблизи контрольной точки.
#Distance <math>\leftarrow \infty</math>
 
#<math>R\leftarrow \infty</math>
#<math>T\leftarrow </math> NaN
#<math>\forall ~ f_m\in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].Множество отражающих объектов()</tt>
#<math>\forall ~ f_m\in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].Множество отражающих объектов()</tt>
##<math>\forall ~ t_{mn} \in f_m</math><tt>.Множество отражающих поверхностей()</tt>
##<math>\forall ~ t_{mn} \in f_m</math><tt>.Множество отражающих поверхностей()</tt>
###<tt><math>P' \leftarrow</math> [[Распространение радиоволн ВЧ/Луч|Ray]].Пересечение([[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>t_{mn}</math>]].Плоскость грани())</tt>
###<tt><math>p \leftarrow</math> [[Распространение радиоволн ВЧ/Луч|Ray]].Пересечение([[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>t_{mn}</math>]].Плоскость())</tt>
###Если <tt>[[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>t_{mn}</math>]].Принадлежность(<math>P'</math>)</tt>
###Если <tt>[[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>t_{mn}</math>]].Принадлежность(<math>p</math>)</tt>
####Distance' <math>\leftarrow</math><tt> Расстояние(Position, <math>P'</math>)</tt>
####<math>r\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Луч|Ray]].Пробег(<math>p</math>)</tt>
####Если Distance' <math><</math> Distance
####Если <math>r < R</math>
#####Distance <math>\leftarrow</math> Distance'
#####<math>R \leftarrow r</math>
#####<math>t' \leftarrow t_{mn}</math>
#####<math>T \leftarrow t_{mn}</math>
#####<math>P \leftarrow P'</math>
#####<math>P \leftarrow p</math>
#<math>\forall ~ \rho_k \in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Множество контрольных точек|Множество контрольных точек()]]</tt>
#<math>\forall ~ O_k \in</math><tt> [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Плоскость вывода результатов|Множество плоскостей вывода результатов()]]</tt>
##Если <math>\rho_k \in </math><tt> [[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].Область регистрации луча <math>(\theta,~\varphi,~\frac{\Delta_{\theta} (\theta)}{2^i},~\frac{\Delta_{\varphi} (\theta, \varphi)}{2^i},</math> Distance<math>)</math></tt>
##<tt><math>p \leftarrow</math> [[Распространение радиоволн ВЧ/Луч|Ray]].Пересечение([[Распространение радиоволн ВЧ/Плоскость вывода результатов|<math>O_k</math>]].Плоскость())</tt>
###<tt><math>\rho_k</math>.Зарегистрировать([[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].Напряженность<math>(\omega_n,~\theta,~\varphi</math>, Расстояние(Position, <math>\rho_k</math>.Позиция()), [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Среда распространения|Среда распространения()]]<math>)</math>)</tt>
##Если <tt>[[Распространение радиоволн ВЧ/Плоскость вывода результатов|<math>O_k</math>]].Принадлежность(<math>p</math>)</tt>
#Если <tt>[[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].Напряженность<math>(\omega_n,~\theta,~\varphi</math>, Distance, [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Среда распространения|Среда распространения()]]</tt><math>)>E_{end} ~\wedge~ \overline{(t' \colon ~\varnothing)}</math>
###<math>r\leftarrow</math><tt> [[Распространение радиоволн ВЧ/Луч|Ray]].Пробег(<math>p</math>)</tt>
##Angle <tt><math>\leftarrow</math> [[Распространение радиоволн ВЧ/Луч|Ray]].Угол пересечения([[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>t'</math>]].Плоскость грани())</tt>
###Если <math>r < R</math>
##<math>s_j \leftarrow</math><tt> [[Распространение радиоволн ВЧ/Вторичный источник при рейтрейсинге|Вторичный источник при рейтрейсинге]].Создать([[Распространение радиоволн ВЧ/Источник|<math>s_j</math>]].Напряженность<math>(\omega_n,~\theta,~\varphi</math>, Distance, [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Среда распространения|Среда распространения()]]<math>),</math> Angle, <math>P,~t'</math>)</tt>
####<math>\rho \leftarrow</math><tt> [[Распространение радиоволн ВЧ/Плоскость вывода результатов|<math>O_k</math>]].Ближайшая контрольная точка(<math>p</math>)</tt>
##<math>\theta \leftarrow 0</math>
####<tt><math>\rho</math>.Зарегистрировать([[Распространение радиоволн ВЧ/Луч|Ray]], <math>r</math>, [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Среда распространения|Среда распространения()]])</tt>
##<math>\varphi \leftarrow 0</math>
#Если <math>T \not\equiv</math> NaN
#<tt>Trace(Ray, [[Распространение радиоволн ВЧ/Геометрическая модель|G]], <math>E_{end}</math>)</tt>
##<tt><math>\gamma \leftarrow</math> [[Распространение радиоволн ВЧ/Луч|Ray]].Угол пересечения([[Распространение радиоволн ВЧ/Грань отражающего объекта|<math>T</math>]].Плоскость())</tt>
##<tt>[[Распространение радиоволн ВЧ/Луч|Ray]].Отразить(<math>T,~P,~R,~\gamma</math>, [[Распространение радиоволн ВЧ/Геометрическая модель|G]].[[Распространение радиоволн ВЧ/Среда распространения|Среда распространения()]])</tt>
##Если <tt>[[Распространение радиоволн ВЧ/Луч|Ray]].Напряженность <math> >E_{end} </math></tt>
###<tt>Trace(Ray, [[Распространение радиоволн ВЧ/Геометрическая модель|G]], <math>E_{end}</math>)</tt>


===<tt>Postprocessing</tt>===
===<tt>Postprocessing</tt>===
Строка 170: Строка 218:
====Сложность====
====Сложность====
====Возможности распараллеливания====
====Возможности распараллеливания====
<graphviz size=500px>
digraph ray_tracing_EM_parallel_run{
rankdir=LR;
node[fontsize=14];
edge[fontsize=14];
G0[label="ВХОД"];
G1[label="1"];
G2_1[label="2"];
G3_1[label="3"];
G4_1[label="4"];
G5_1[label="5"];
G2_2[label="2"];
G3_2[label="3"];
G4_2[label="4"];
G5_2[label="5"];
G6_1_1[label="6"];
G6_1_2[label="6"];
G6_2_1[label="6"];
G6_2_2[label="6"];
G7_1_1_1[label="7.1"];
G7_3_1_1[label="7.3"];
G7_4_1_1_1[label="7.4"];
G7_4_1_1_2[label="7.4"];
G7_5_1_1_1_1[label="7.5"];
G7_13_1_1_1_1[label="7.13"];
G7_5_1_1_1_2[label="7.5"];
G7_13_1_1_1_2[label="7.13"];
G7_5_1_1_2_1[label="7.5"];
G7_13_1_1_2_1[label="7.13"];
G7_5_1_1_2_2[label="7.5"];
G7_13_1_1_2_2[label="7.13"];
G7_14_1_1_1[label="7.14"];
G7_14_1_1_2[label="7.14"];
G7_15_1_1[label="7.15"];
G7_16_1_1[label="7.16"];
G7_17_1_1_1[label="7.17"];
G7_24_1_1_1[label="7.24"];
G7_17_1_1_2[label="7.17"];
G7_24_1_1_2[label="7.24"];
G7_25_1_1[label="7.25"];
G7_32_1_1[label="7.32"];
G7_1_1_2[label="7.1"];
G7_3_1_2[label="7.3"];
G7_4_1_2_1[label="7.4"];
G7_4_1_2_2[label="7.4"];
G7_5_1_2_1_1[label="7.5"];
G7_13_1_2_1_1[label="7.13"];
G7_5_1_2_1_2[label="7.5"];
G7_13_1_2_1_2[label="7.13"];
G7_5_1_2_2_1[label="7.5"];
G7_13_1_2_2_1[label="7.13"];
G7_5_1_2_2_2[label="7.5"];
G7_13_1_2_2_2[label="7.13"];
G7_14_1_2_1[label="7.14"];
G7_14_1_2_2[label="7.14"];
G7_15_1_2[label="7.15"];
G7_16_1_2[label="7.16"];
G7_17_1_2_1[label="7.17"];
G7_24_1_2_1[label="7.24"];
G7_17_1_2_2[label="7.17"];
G7_24_1_2_2[label="7.24"];
G7_25_1_2[label="7.25"];
G7_32_1_2[label="7.32"];
G7_1_2_1[label="7.1"];
G7_3_2_1[label="7.3"];
G7_4_2_1_1[label="7.4"];
G7_4_2_1_2[label="7.4"];
G7_5_2_1_1_1[label="7.5"];
G7_13_2_1_1_1[label="7.13"];
G7_5_2_1_1_2[label="7.5"];
G7_13_2_1_1_2[label="7.13"];
G7_5_2_1_2_1[label="7.5"];
G7_13_2_1_2_1[label="7.13"];
G7_5_2_1_2_2[label="7.5"];
G7_13_2_1_2_2[label="7.13"];
G7_14_2_1_1[label="7.14"];
G7_14_2_1_2[label="7.14"];
G7_15_2_1[label="7.15"];
G7_16_2_1[label="7.16"];
G7_17_2_1_1[label="7.17"];
G7_24_2_1_1[label="7.24"];
G7_17_2_1_2[label="7.17"];
G7_24_2_1_2[label="7.24"];
G7_25_2_1[label="7.25"];
G7_32_2_1[label="7.32"];
G7_1_2_2[label="7.1"];
G7_3_2_2[label="7.3"];
G7_4_2_2_1[label="7.4"];
G7_4_2_2_2[label="7.4"];
G7_5_2_2_1_1[label="7.5"];
G7_13_2_2_1_1[label="7.13"];
G7_5_2_2_1_2[label="7.5"];
G7_13_2_2_1_2[label="7.13"];
G7_5_2_2_2_1[label="7.5"];
G7_13_2_2_2_1[label="7.13"];
G7_5_2_2_2_2[label="7.5"];
G7_13_2_2_2_2[label="7.13"];
G7_14_2_2_1[label="7.14"];
G7_14_2_2_2[label="7.14"];
G7_15_2_2[label="7.15"];
G7_16_2_2[label="7.16"];
G7_17_2_2_1[label="7.17"];
G7_24_2_2_1[label="7.24"];
G7_17_2_2_2[label="7.17"];
G7_24_2_2_2[label="7.24"];
G7_25_2_2[label="7.25"];
G7_32_2_2[label="7.32"];
G8_1[label="8"];
G14_1[label="14"];
G8_2[label="8"];
G14_2[label="14"];
G15[label="15"];
SKIP_1[label="...", shape="none"];
SKIP_2[label="...", shape="none"];
SKIP_3[label="...", shape="none"];
SKIP_4[label="...", shape="none"];
SKIP_5[label="...", shape="none"];
SKIP_6[label="...", shape="none"];
SKIP_7[label="...", shape="none"];
SKIP_8[label="...", shape="none"];
SKIP_9[label="...", shape="none"];
SKIP_10[label="...", shape="none"];
//SKIP_11[label="...", shape="none"];
SKIP_12[label="...", shape="none"];
SKIP_13[label="...", shape="none"];
SKIP_14[label="...", shape="none"];
SKIP_15[label="...", shape="none"];
SKIP_16[label="...", shape="none"];
SKIP_17[label="...", shape="none"];
SKIP_18[label="...", shape="none"];
SKIP_19[label="...", shape="none"];
SKIP_20[label="...", shape="none"];
SKIP_21[label="...", shape="none"];
SKIP_22[label="...", shape="none"];
SKIP_23[label="...", shape="none"];
SKIP_24[label="...", shape="none"];
SKIP_25[label="...", shape="none"];
SKIP_26[label="...", shape="none"];
SKIP_27[label="...", shape="none"];
SKIP_28[label="...", shape="none"];
SKIP_29[label="...", shape="none"];
SKIP_30[label="...", shape="none"];
SKIP_31[label="...", shape="none"];
G0->G1->{G2_1, G2_2}
G2_1->G3_1->G4_1->G5_1->{G6_1_1, G6_1_2}
G6_1_1->G7_1_1_1
G6_1_2->G7_1_1_2
{G7_32_1_1, G7_32_1_2}->G8_1->SKIP_30->G14_1
G2_2->G3_2->G4_2->G5_2->{G6_2_1, G6_2_2}
G6_2_1->G7_1_2_1
G6_2_2->G7_1_2_2
{G7_32_2_1, G7_32_2_2}->G8_2->SKIP_31->G14_2
{G14_1, G14_2}->G15->"ВЫХОД"
G7_1_1_1->G7_3_1_1->{G7_4_1_1_1, G7_4_1_1_2}
G7_4_1_1_1->{G7_5_1_1_1_1, G7_5_1_1_1_2}
G7_5_1_1_1_1->SKIP_1->G7_13_1_1_1_1
G7_5_1_1_1_2->SKIP_2->G7_13_1_1_1_2
{G7_13_1_1_1_1, G7_13_1_1_1_2}->G7_14_1_1_1
G7_4_1_1_2->{G7_5_1_1_2_1, G7_5_1_1_2_2}
G7_5_1_1_2_1->SKIP_3->G7_13_1_1_2_1
G7_5_1_1_2_2->SKIP_4->G7_13_1_1_2_2
{G7_13_1_1_2_1, G7_13_1_1_2_2}->G7_14_1_1_2
{G7_14_1_1_1, G7_14_1_1_2}->G7_15_1_1->G7_16_1_1->{G7_17_1_1_1, G7_17_1_1_2}
G7_17_1_1_1->SKIP_5->G7_24_1_1_1
G7_17_1_1_2->SKIP_6->G7_24_1_1_2
{G7_24_1_1_1, G7_24_1_1_2}->G7_25_1_1->SKIP_15->G7_32_1_1
G7_1_1_2->G7_3_1_2->{G7_4_1_2_1, G7_4_1_2_2}
G7_4_1_2_1->{G7_5_1_2_1_1, G7_5_1_2_1_2}
G7_5_1_2_1_1->SKIP_18->G7_13_1_2_1_1
G7_5_1_2_1_2->SKIP_19->G7_13_1_2_1_2
{G7_13_1_2_1_1, G7_13_1_2_1_2}->G7_14_1_2_1
G7_4_1_2_2->{G7_5_1_2_2_1, G7_5_1_2_2_2}
G7_5_1_2_2_1->SKIP_16->G7_13_1_2_2_1
G7_5_1_2_2_2->SKIP_17->G7_13_1_2_2_2
{G7_13_1_2_2_1, G7_13_1_2_2_2}->G7_14_1_2_2
{G7_14_1_2_1, G7_14_1_2_2}->G7_15_1_2->G7_16_1_2->{G7_17_1_2_1, G7_17_1_2_2}
G7_17_1_2_1->SKIP_7->G7_24_1_2_1
G7_17_1_2_2->SKIP_8->G7_24_1_2_2
{G7_24_1_2_1, G7_24_1_2_2}->G7_25_1_2->SKIP_12->G7_32_1_2
G7_1_2_1->G7_3_2_1->{G7_4_2_1_1, G7_4_2_1_2}
G7_4_2_1_1->{G7_5_2_1_1_1, G7_5_2_1_1_2}
G7_5_2_1_1_1->SKIP_20->G7_13_2_1_1_1
G7_5_2_1_1_2->SKIP_21->G7_13_2_1_1_2
{G7_13_2_1_1_1, G7_13_2_1_1_2}->G7_14_2_1_1
G7_4_2_1_2->{G7_5_2_1_2_1, G7_5_2_1_2_2}
G7_5_2_1_2_1->SKIP_22->G7_13_2_1_2_1
G7_5_2_1_2_2->SKIP_23->G7_13_2_1_2_2
{G7_13_2_1_2_1, G7_13_2_1_2_2}->G7_14_2_1_2
{G7_14_2_1_1, G7_14_2_1_2}->G7_15_2_1->G7_16_2_1->{G7_17_2_1_1, G7_17_2_1_2}
G7_17_2_1_1->SKIP_9->G7_24_2_1_1
G7_17_2_1_2->SKIP_10->G7_24_2_1_2
{G7_24_2_1_1, G7_24_2_1_2}->G7_25_2_1->SKIP_13->G7_32_2_1
G7_1_2_2->G7_3_2_2->{G7_4_2_2_1, G7_4_2_2_2}
G7_4_2_2_1->{G7_5_2_2_1_1, G7_5_2_2_1_2}
G7_5_2_2_1_1->SKIP_24->G7_13_2_2_1_1
G7_5_2_2_1_2->SKIP_25->G7_13_2_2_1_2
{G7_13_2_2_1_1, G7_13_2_2_1_2}->G7_14_2_2_1
G7_4_2_2_2->{G7_5_2_2_2_1, G7_5_2_2_2_2}
G7_5_2_2_2_1->SKIP_26->G7_13_2_2_2_1
G7_5_2_2_2_2->SKIP_27->G7_13_2_2_2_2
{G7_13_2_2_2_1, G7_13_2_2_2_2}->G7_14_2_2_2
{G7_14_2_2_1, G7_14_2_2_2}->G7_15_2_2->G7_16_2_2->{G7_17_2_2_1, G7_17_2_2_2}
G7_17_2_2_1->SKIP_28->G7_24_2_2_1
G7_17_2_2_2->SKIP_29->G7_24_2_2_2
{G7_24_2_2_1, G7_24_2_2_2}->G7_25_2_2->SKIP_14->G7_32_2_2


==Постобработка==
}
</graphviz>

Текущая версия на 07:50, 14 февраля 2018

Модель

Графическая иллюстрация модели рейтрейсинга

Алгоритм

Идея последовательного приближения

Идея заключается в последовательном удвоении числа элементарных модельных экспериментов. Это продолжится до тех пор, пока результат текущего моделирования не приблизится к результату моделирования на предыдущей итерации:

, где

- параметр моделирования, задаваемый пользователем.

Однако сравнение соседних итераций не дает достаточного условия на достижение заданной точности (основная причина этого - излучение по направлениям). Поэтому правильнее будет сравнивать итерации через одну, две и т.д.:

, где

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

При равномерном увеличении числа направлений излучения от первичного источника в два раза путем деления на 2 соответствующего шага по углу в процессе увеличения , только каждое второе направление будет новым, т.е. не учитанным на предыдущих итерациях. Другая половина будет повторять эксперименты, уже выполненные ранее. Поэтому в цикл основной программы введено дополнительное условие для учета этих повторений.

Шаги по азимуту и по зениту источника являются функциями от направления либо постоянными.

Угловой шаг дискретизации как функция ХН

Диаграмма направленности и испускаемые моделью лучи
Зависимость углового шага от азимутального угла

Большинство современных вещательных систем используют панельные антенны с ограниченными углами раствора диаграммы направленности (ДН) в горизонтальной плоскости (до 120°) и очень малыми углами в вертикальной плоскости (до 20°). Соответственно, в таких системах происходит серьезное перераспределение излучаемой энергии в пространстве. Типичные коэффициенты усиления: 16-18 dBi. Поэтому одним из решений задачи оптимизации является использование динамического углового шага дискретизации как функции от характеристики направленности источника.

Изменение частоты дискретизации происходит по следующему закону:

, где

- коэффициент девиации, где
- максимальное и (для любого ) минимальное значение частоты дискретизации;
- максимальное расстояние от источника до границ модели;
- функция ХН;
- угол места и азимутальный угол;
- частота излучения;
- длина излучаемой волны.

Тогда шаг дискретизации (угол) будет меняться по следующим образом:

Общее кол-во лучей определяется выражением:

С учетом, что максимум ДН находится в , получим выражения:

,

.

Инициализация геометрической модели

Перерасчет высот с учетом кривизны земли и рефракции радиоволн в тропосфере.

Входной параметр пересчитывается в соответствии с формулой:

, где

- эквивалентный радиус Земли, где
- радиус Земли (км),
- изменение коэффициента преломления с высотой.
- расстояние до точки с высотой .

Основной цикл программы | Вариант 1

Предусловия

  • - входное описание среды распространения моделируемого поля, заданное геометрической моделью.
  • - номер итерации моделирования, .

Основное течение

  1. G.Множество первичных источников()
  2. Если то ВЫХОД
    1. .Антенна().Тип антенны().Амплитудно-частотная характеристика()
      1. Если
        1. Если
          1. Position .Антенна().Позиция()
          2. Ray Луч().Создать(Position, .Антенна().Мировая система координат(Вектор))
          3. Distance
          4. G.Множество отражающих объектов()
            1. .Множество отражающих поверхностей()
              1. Ray.Пересечение(.Плоскость грани())
              2. Если .Принадлежность()
                1. Distance' Расстояние(Position, )
                2. Если Distance' Distance
                  1. Distance Distance'
          5. G.Множество контрольных точек()
            1. Если .Область регистрации луча Distance
              1. .Зарегистрировать(.Напряженность, Расстояние(Position, .Позиция()), G.Среда распространения())
          6. Если .Напряженность, Distance, G.Среда распространения()
            1. Angle Ray.Угол пересечения(.Плоскость грани())
            2. Вторичный источник при рейтрейсинге.Создать(.Напряженность, Distance, G.Среда распространения() Angle, )
  3. Переход на шаг 2

Свойства алгоритма

Сложность

Возможности распараллеливания

Основной цикл программы | Вариант 2

Геометрическая модель (рей-трейсинг 2). Наследует свойства Геометрической модели.

  • Предикат завершения(). При возвращает истину, иначе возвращает значение функции SubApprox для результатов моделирования не предыдущем и на текущем этапах, а также для включаемого отклонения и допустимого процента точек .

Предусловия

  • - входное описание среды распространения моделируемого поля, заданное геометрической моделью.
  • - список частот, на которых необходимо провести моделирование.
  • - критическое значение напряженности, на котором дальнейшая трассировка луча прекращается.
  • - критерий разности между текущим и предыдущим результатом моделирования, при которой можно считать, что поле промоделированно точно.

Основное течение

    1. Pre_SCP G.Множество контрольных точек() //Копирование состояния до изменения.
    2. Set_event Preprocessing()
    3. Set_event
      1. Ray Луч().Создать(, )
      2. Trace(Ray, G, )
    4. Postprocessing(G.Множество контрольных точек())
    5. SAcheck SucApprox(G.Множество контрольных точек(), Pre_SCP, )
    6. Если SAcheck
      1. Переход на 1.2
  1. ВЫХОД

[Таблица событий] Preprocessing(Геометрическая модель, Номер итерации, Частота)

Функция создает таблицу событий, необходимых обработать. В качестве событий - испускаемые моделью лучи на данной частоте.

  1. Пустой односвязный список значений .
  2. Геометрическая модель.
  3. Номер итерации
  4. Частота
  5. G.Множество первичных источников()
    1. Если .Антенна().Тип антенны().Амплитудно-частотная характеристика()
      1. Пока
        1. Пока
          1. Если
            1. .Добавить
  6. Вернуть Массив()

Если , и , то есть углы распределены равномерно, таблица может быть реализована в виде массива значений , элементы которого могут заполняться параллельно, без синхронизации. Если же размер таблицы заранее не определен (общий случай), то таблица реализуется связанным списком, добавление элементов в который должно защищаться мьютексом на шаге 4.1.3.1.3.1.1, а алгоритм на заключительном шаге преобразует связанный список в массив с произвольным доступом. Второй путь при параллельном выполнении - создавать таблицы в локальной памяти потока, после выполнения которых - объединять таблицы в массив в основном потоке.

Параллельная форма

Параллельное выполнение в общем случае возможно только цикла, перебирающего первичные источники (шаг 4), так как распределение углов заранее не определено.

Пусть - число потоков, выполняющих функцию. Пусть - массив изначально пустых связанных списков троек , так, что - -тый список массива, .

  1. Номер итерации
  2. Частота
  3. Создать массив.
  4. G.Множество первичных источников()
    1. индекс потока.
    2. Если .Антенна().Тип антенны().Амплитудно-частотная характеристика()
      1. Пока
        1. Пока
          1. Если
            1. .Добавить
  5. Вернуть Массив

Trace

Функция трассирует луч через геометрическую модель и и фиксирует его прохождение вблизи контрольной точки.

  1. NaN
  2. G.Множество отражающих объектов()
    1. .Множество отражающих поверхностей()
      1. Ray.Пересечение(.Плоскость())
      2. Если .Принадлежность()
        1. Ray.Пробег()
        2. Если
  3. G.Множество плоскостей вывода результатов()
    1. Ray.Пересечение(.Плоскость())
    2. Если .Принадлежность()
      1. Ray.Пробег()
      2. Если
        1. .Ближайшая контрольная точка()
        2. .Зарегистрировать(Ray, , G.Среда распространения())
  4. Если NaN
    1. Ray.Угол пересечения(.Плоскость())
    2. Ray.Отразить(, G.Среда распространения())
    3. Если Ray.Напряженность
      1. Trace(Ray, G, )

Postprocessing

Функция "проявляет" поле в контрольных точках по накопленным значениям напряженности от всех пришедших лучей.

SucApprox

Функция сравнивает текущие результаты моделирования с результатами, полученными на предыдущем шаге. На выходе получаем флаг, по которому решаем, следует ли продолжать уточнять модель.

Свойства алгоритма

Сложность

Возможности распараллеливания