Просмотр полной версии : ANT Язык описания антенн
Redoutable
16.08.2019, 00:21
ОБОСНОВАНИЕ
Язык описания антенн ANT призван закрыть соответствующую нишу при моделировании проволочных антенн. Конечно, в большинстве случаев можно вполне обойтись существующими способами представления, такими как *.MAA, *.NEC и др. Но при моделировании сложных антенн состоящих из множества однотипных элементов давно просится язык позволяющий описывать антенны и манипулировать их геометрией. Конечно, можно сгенерировать антенну любой сложности на традиционном языке программирования, таком как C, C++, C# .. Есть масса графических средств на эту же тему. ANT это некоторая альтернатива между графикой, низкоуровневым кодированием (*.MAA, *.NEC) или прямым программированием на традиционных языках (С, С++, ..). Его преимущества: 1) Читаемость-наглядность; 2) Отсутствие тавтологий. 3) Свободный стиль изложения. 4) Комбинируемость элементов.
СКАЧАТЬ >>> 238489 <<< СКАЧАТЬ
Redoutable
16.08.2019, 00:24
ЗАПУСК КОМПИЛЯТОРА
ant.exe --help
Usage:
ant.exe fname.ant [parms] [options]
fname.ant:
имя вх.файла
parms:
параметры для главной функции ant (p0, p1, ...)
options:
-b --BOM добавить в начало вых.файла Byte Order Mark;
-c --com= уровень передачи комментариев: {0-без комментариев, 1-однострочный, 2-многострочный};
-d --dec= кодовая страница для вх.файла 65001(UTF-8) - по умолчанию;
-e --enc= кодовая страница для вых.файла 65001 - по умолчанию;
-f --fmt= формат выходного файла {maa/nec};
-h --help данный хэлп;
-o --out= имя вых.файла (или по умолчанию будет "имя вх.файла" + ".nec/.maa").
Redoutable
16.08.2019, 00:28
HELLO ANT!
Создаем файл с именем hello.ant так:
ant()
{
<[1,2,3][4,5,6][7,8,9]>
}
или так:
ant()
{
< [1,2,3]
[4,5,6]
[7,8,9] >
}
Запускаем компиляцию и смотрим результат:
ant.exe hello.ant --fmt=nec
' # S X0 Y0 Z0 X1 Y1 Z1 R
GW 1 53 1 2 3 4 5 6 0.001
GW 2 53 4 5 6 7 8 9 0.001
ant.exe hello.ant --fmt=maa
*** X1 Y1 Z1 X2 Y2 Z2 R S
1, 2, 3, 4, 5, 6, 0.001, 53
4, 5, 6, 7, 8, 9, 0.001, 53
ANT оперирует такой категорией как ТОЧКА, которая обозначается квадратными скобками так: [x,y,z]. Другая категория языка - ПРОВОД состоящий из последовательности точек заключенных в < скобки >. В приведенном выше примере hello.ant провод задан 3-мя точками. Остальные значения такие как радиус провода и сегментация определяются по умолчанию. Но при необходимости могут быть переопределены в любой момент:
ANT ()
{
RADIUS = 0.001; SEGMENT = 0.2; ...
}
Разделять операторы точками с запятой ( ; ) совершенно не обязательно. Они используются исключительно для повышения читаемости кода. Особенно это может быть полезно когда операторы расположены в одну строчку.
Redoutable
16.08.2019, 00:30
КОММЕНТАРИИ
В любое место (между лексемами) могут быть вставлены комментарии:
# Однострочный комментарий начинается с символа #-диез и продолжается до конца строки "\r\n".
/*
МНОГО-
СТРОЧНЫЙ КОММЕНТАРИЙ
обозначается так
*/
Redoutable
16.08.2019, 00:33
ПЕРЕМЕННЫЕ/ТОЧКИ
В ANT любая переменная или константа это вектор [x,y,z]. Даже если она выглядит как скаляр (например: A = 1) это все равно вектор (предполагает: A = [1,1,1]). Она определяется с момента его первого вхождения в левой части оператора присваивания (как в Бейсике). Любая переменная это есть точка с 3-мя координатами. Значение переменной/точке присваивается векторным или скалярным выражением:
T1 = [1,2,3] # вектор
T2 = 1 # скаляр (эквивалентно T2 = [1,1,1])
ALFA = [1+2,3,4] # итого: ALFA = [3,3,4]
BETA = [1,2,3] + 4 * 5 # эквивалентно BETA = [1,2,3] + [4,4,4] * [5,5,5] = [1+4*5,2+4*5,3+4*5] = [21,22,23]
Максимальная длина имени не ограничена. При назначении имен переменным возможно использование символов национального алфавита:
ДЛИНА_ПРОВОДА = 15
Верхний и нижний регистры не различаются:
Длина_Провода = 15 # эквивалентно: ДЛИНА_ПРОВОДА = 15
А теперь рассмотрим более практический пример:
# Вертикальный крест с приподнятыми концами на ножке
ANT()
{
H = 10 # высота
D = 1 # отступ
GND = [0,0,0] # земля
CROSS = [0,0,H] # верхняя точка пересечения
< GND CROSS > # ножка
<[-D,0,H+1] CROSS [+D,0,H+1]> # вдоль
<[0,-D,H+1] CROSS [0,+D,H+1]> # и поперек
}
Получаем:
' # S X0 Y0 Z0 X1 Y1 Z1 R
GW 1 101 0 0 0 0 0 10 0.001 ' ножка
GW 2 15 -1 0 11 0 0 10 0.001 ' вдоль
GW 3 15 0 0 10 1 0 11 0.001
GW 4 15 0 -1 11 0 0 10 0.001 ' поперек
GW 5 15 0 0 10 0 1 11 0.001
238465
Redoutable
16.08.2019, 00:36
ОБЛАСТЬ ВИДИМОСТИ ПЕРЕМЕННЫХ
Область видимости обозначается { фигурными скобками } и определяет видимость переменных. Переменная определенная во внутренней области невидима во внешней.
ANT()
{
A = 1
{
B = 2
C = A + B
}
D = A * B # Ошибка! Переменная B невидима на этом уровне!
}
Redoutable
16.08.2019, 00:37
ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
В ANT имеется механизм ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ, синтаксис которого следующий:
ANT()
{
A = 1
< A 0 > # получим <[1,1,1][0,0,0]>
{
$ A = 2 # символ $ определяет локальную переменную, а старую загоняет в стек.
< A 0 > # получим <[2,2,2][0,0,0]>
}
{
< A 0 > # получим <[1,1,1][0,0,0]>
}
< A 0 > # получим <[1,1,1][0,0,0]>
}
Такой механизм принят, в основном для локального переопределения радиуса провода и сегментации.
ANT()
{
RADIUS = 0.001
< 0 1 > # здесь радиус провода 0.001
{
$ RADIUS = 0.002
< 2 3 > # здесь радиус провода 0.002
}
< 4 5 > # здесь снова радиус провода 0.001
}
Redoutable
16.08.2019, 00:39
ОПРЕДЕЛЕНИЕ ИСТОЧНИКОВ И НАГРУЗОК
Источники задаются оператором SOURCE (позиция, амплитуда, фаза) примерно так:
<[1,2,3] SOURCE (0.5,1,0) [4,5,6] .. >
Здесь источник включен в отрезок определяемый точкой [1,2,3] и точкой [4,5,6] в позиции = 0.5 (ровно по-середине), амплитуда = 1V, фаза = 0° Если надо задать позицию источника ближе к началу отрезка указываем значение ближе к 0.0, к концу отрезка - ближе к 1.0
Нагрузки задаются оператором LOAD (позиция, R, jX) следующим образом:
<[1,2,3] LOAD (0.25,1,2) [4,5,6] .. >
При желании в любой межточечный промежуток можно поместить сколько угодно источников и нагрузок:
<[1,2,3] LOAD (0.25,1,2) SOURCE (0.5,1,0) LOAD (0.75,1,2) .. [4,5,6] .. >
Redoutable
16.08.2019, 00:41
ОПЕРАТОР ПОВТОРА
Синтаксис:
REPEAT (exp) # Где exp - выражение определяющее сколько раз повторить цикл
{
...
}
Пример:
ANT ()
{
I = 0
REPEAT (1+1)
{
J = 10
REPEAT (3)
{
< I J >
J = J + 1
}
I = I + 1
}
}
Получим:
# S X0 Y0 Z0 X1 Y1 Z1 R
GW 1 173 0 0 0 10 10 10 0.001
GW 2 191 0 0 0 11 11 11 0.001
GW 3 209 0 0 0 12 12 12 0.001
GW 4 157 1 1 1 10 10 10 0.001
GW 5 173 1 1 1 11 11 11 0.001
GW 6 191 1 1 1 12 12 12 0.001
Redoutable
16.08.2019, 00:44
ОПЕРАТОР УСЛОВИЯ
Синтаксис:
IF условие THEN then-ветка [ELSE else-ветка] FI
Здесь такая особенность. В then-ветке и else-ветке видимость переменных не изменяется. Это сделано для того чтобы операторы преобразования координат внутри веток могли оперировать внешним окружением. При необходимости создать локальную область видимости внутри THEN/ELSE используйте {}-скобки.
Пример:
ANT()
{
IF 1 << 2 THEN <999 1> ELSE <999 (-1)> FI
IF 1 >> 2 THEN <999 2> ELSE <999 (-2)> FI
IF true THEN <999 5> <999 6> FI
}
Получим:
' # S X0 Y0 Z0 X1 Y1 Z1 R
GW 1 17287 999 999 999 1 1 1 0.001
GW 2 15415 999 999 999 -2 -2 -2 0.001
GW 3 17217 999 999 999 5 5 5 0.001
GW 4 17217 999 999 999 6 6 6 0.001
В конструкции IF допустимы следующие операторы сравнения:
== Равно
<> Не равно
<< Больше (сделаны двойными чтобы не путать с <..> скобками)
>> Меньше
<= Больше или равно
>= Меньше или равно
и операторы исчисления логики:
NOT инверсия
AND конъюнкция
OR дизъюнкция
XOR исключающее или
Приоритетность операторов традиционная: 1) Сначала скобки; 2) Затем унарный (+,-); 3) Далее арифметические; 4) Инверсия; 5) Конъюнкция; 6) и наконец Дизъюнкция-Исключающее ИЛИ.
Да. Арифметика псевдо-векторная, типа: [1,2,3] + [4,5,6] = [1+4, 2+5, 3+6]. Почему псевдо? Потому что умножение и деление выполняются по тому же принципу: [1,2,3] * [4,5,6] = [1*4, 2*5, 3*6].
Redoutable
16.08.2019, 00:48
ОПЕРАТОРЫ ГРУППОВОГО ПРЕОБРАЗОВАНИЯ КООРДИНАТ
В ANT встроены следующие операторы группового преобразования координат:
MOVE (dx, dy, dz) - смещение на указанную величину: [x, y, z] + [dx, dy, dz] = [x + dx, y + dy, z + dz]
SCALE (mx, my, mz) - умножение на указанную величину: [x, y, z] * [mx, my, mz] = [x * mx, y * my, z * mz]
ROTATE (ax, by, cz) - поворот вокруг оси OX на угол ax, потом поворот вокруг оси OY на угол by, потом поворот вокруг оси OZ на угол cz (крен, тангаж, рысканье).
ROTATE ([vx, vy, vz], a) - поворот вокруг заданного вектора [vx, vy, vz] на угол a (Квантернион).
Операторы SCALE и ROTATE по умолчанию выполняются относительно начала координат. Однако, возможно переопределить системную переменную CENTER = [x,y,z]. После чего указанные преобразования будут выполняться относительно указанной точки.
Область действия оператора определяется текущей областью видимости. При этом оператор воздействует на все определенные точки от начала указанной области до самого оператора.
Например:
ANT()
{
< t1 t2 .. >
{ ### начало локальной области видимости
< t3 t4 .. >
< t5 t6 .. >
MOVE (dx,dy,dz) # действует на < t3 t4 .. > и < t5 t6 .. >
< t7 t8 .. >
} ### конец локальной области видимости
SCALE (1,1,-1) # действует на всех кроме < t9 t10 .. >
< t9 t10 .. >
}
Здесь оператор MOVE (dx,dy,dz) воздействует на провода < t3 t4 .. > и < t5 t6 .. > Провод < t1 t2 .. > и < t9 t10 .. > находятся вне области видимости. Провод < t7 t8 .. > тоже, т.к. к моменту исполнения оператора еще не определен. Оператор SCALE (1,1,-1) воздействует на все провода кроме < t9 t10 .. >.
Redoutable
16.08.2019, 00:49
ВСТРОЕННЫЕ ФУНКЦИИ
Функции одного аргумента: ABS, ACOS, ASIN, ATAN, CEIL, COS, EXP, FLOOR, LOG, LOG10, ROUND, SIN, SQR, TAN.
Функции 2-х аргументов: POW, MOD.
Функции с переменным числом аргументов: MAX, MIN.
Redoutable
16.08.2019, 00:51
ПРЕДОПРЕДЕЛЕННЫЕ ПЕРЕМЕННЫЕ
Во всех режимах действуют:
CENTER = [0, 0, 0] Центр относительно которого выполняются операции ROTATE и SCALE.
FREQUENCY = [1, 0, 0] Частота, Шаг частоты, Число шагов для NEC [MHz].
GROUND = [0, 0, 0] Тип земли, Диэлектрическая проницаемость, Проводимость.
SEGMENT = [0.1, 0.1, 0.1] Длина сегмента [в метрах].
RADIUS = [0.001, 0.001, 0.001] Радиус провода [в метрах].
PI = [3.14.., 3.14.., 3.14..] Математическая константа.
В режиме --fmt=MAA также действуют:
MAA_DM1DM2SC = [800,80,2] DM1 - if (Seg == -1) Lw / DM2 .. Lw / DM1 от середины к краям //Seg == -2 только с начала //Seg == -3 только с конца; DM2 - if (Seg == 0) Lseg = Lw / DM2; SC - множитель уплотнения (1..64)
MAA_ECHM = [2, 0, 0] EC - с какого расстояния от края провода начнется уплотнение 1.001-сразу с середины .. 3.0-без уплотнения; H - Высота [в метрах]; M = {0 .. 6} Материал [Пункт меню в MMANA].
MAA_RjX = [0, 0, 0] Сопротивление нагрузки R, jX
MAA_AzEl = [0, 0, 0] Азимут, Элевация
Все эти переменные могут быть в любой момент переопределены. Даже PI.
Redoutable
16.08.2019, 00:53
ПЕРЕДАЧА ВНЕШНИХ ПАРАМЕТРОВ
В ANT-е реализован следующий механизм передачи параметров компилятору:
Запускаем компилятор где после исходного fname.ant через пробел перечисляем параметры для передачи:
ant.exe fname.ant 1 2 3 ...
В самом fname.ant в функции ant() делаем заголовок cо списком параметров:
ANT (P1, P2, P3)
{
< [P1, 2 + P2, 3 * P3] [4,5,6] .. > # и далее используем полученные значения
}
Также, возможно определение значений по умолчанию.
ANT (F = 15, D = 1)
{
LW = 300 / F # длина волны
D ... # - плечо вибратора
...
}
В этом случае если в списке параметров отсутствуют соответствующие значения, они принимаются по умолчанию. Если значение по умолчанию не задано, оно принимается равным нулю.
ant.exe fname.ant 111 222 # F=111; D=222
ant.exe fname.ant 333 # F=333; D=1
ant.exe fname.ant # F=15; D=1
Redoutable
16.08.2019, 00:54
ЧИТАТЬ С НИЗУ-ВВЕРХ :ржать:
ЧИТАТЬ С НИЗУ-ВВЕРХ
Идея замечательная. Из вышенижеизложенного не понятно - это только ещЁ проект или компилятор уже реализован? Его уже можно опробовать?
Смотрится для определённых случаев не плохо. Но явно надо компилятор *.maa > *.ant. Создавать антенны всё-таки удобнее и быстрее в "графической рисовалке". А вот для "сложных случаев" как раз не плохо иметь программный подход.
Другими словами, я вижу такой use case: *maa > *.ant > *.maa.
это только ещЁ проект или компилятор уже реализован?
Присоединяюсь к вопросу.
У меня есть на C++ несколько простых программ, так как когда то был ПОшником (Pascal, C, html, Csharp), с помощью которых создавал такие модели
238446
238447
Это бывает полезным при создании повторяющихся структур или периодических (типа логи, кстати есть транслятор моделей из лог в MMANA)
Но так что бы что то супер серьезное сооружать под движок MMANA - не знаю... ее интерфейс и так прост, как автомат Калашникова.
Я никогда не рисую в графическом интерфейсе - сразу шпарю в координатах, так как в голове "картинка" уже сложилась. Единственное - калькулятор под руками, координаты прикинуть :s7:
Как на такие диски и конусы - не ругается ли MMANA? Слишком много проводов в одну точку сходятся под острым углом.
Иван, а вот бы забабахать двухзаходную логопериодическую спираль. В MMANA я ее заахался рисовать.
Михаил, была задача проверить сходимость практических результатов в УКВ диапазоне с расчетами в ММАНе и других программах. В КВ и УКВ - все сходится вполне нормально, в железе КСВН даже с меньшей неравномерностью.
238451
А для двухзаходных логопериодических спиралей есть CST, HFSS .... или старые советские книги - Юрцев О.А., Рунов А.В., Казарин А.Н. Спиральные антенны
238453
Я никогда не рисую в графическом интерфейсе - сразу шпарю в координатах, так как в голове "картинка" уже сложилась. Единственное - калькулятор под руками, координаты прикинуть
А я привык "размножать" простые структуры через операции поворота, или сдвига и превращать их в сложные , вставляя результат преобразования ( поворот, сдвиг) вручную прямо в текстовый файл ( правка описания антенны).
В NEC2 с этим всё проще. Там прямо в описании модели можно задавать "размножение" структур через поворот, сдвиг и осевую симметрию.
Давно задаюсь вот каким вопросом . В проволочных моделях плоских структур в ММАНе получается так, что с обеих сторон сетки текут одинаковые токи. Но в реальных зеркалах, стенках рупоров и т.п. в идеале токи текут только с одной стороны.
По этой причине не увлекаюсь моделями из сетки. Использую в NEC2 моделирование при помощи "patch`ей" - плоских проводящих прямоугольников .
Как на такие диски и конусы - не ругается ли MMANA?
Так она и не ругается. Просто врёт и не подмигивает даже. Не всегда , правда.
Redoutable
16.08.2019, 12:33
238505
# Генерация диско-конусника
ant
(
N = 15, # Число секторов
H = 15, # Общая высота
U = 2, # Высота ножки
D = 10, # Высота юбки
R1 = 10, # Радиус шляпы
R2 = 10, # Радиус юбки
)
{
a = 360 / n # угол сектора
ca = cos (a)
sa = sin (a)
<[0,0,0] SOURCE (0.5, 1, 0) [0,0,U]> # ножка
b = 0
repeat (N)
{
< [0, 0, 0] [R1, 0, 0 ] [R1*ca, R1*sa, 0 ] > # Шляпа
< [0, 0, U] [R2, 0, U+D] [R2*ca, R2*sa, U+D] > # Юбка
rotate (0,0,b) # Повернуть на угол сектора
b = b + a
}
scale (1,1,-1) # Перевернуть по вертикали
move (0, 0, H) # Поднять на заданную высоту
}
238463
Redoutable
16.08.2019, 13:23
Идея замечательная. Из вышенижеизложенного не понятно - это только ещЁ проект или компилятор уже реализован? Его уже можно опробовать?
В самом первом посте есть сцылка на ANT2.ZIP ( 238490 )
U = 2, # Высота ножки
Лучше сделать это значение 0,2-0,3 - это ближе к правильному.
Прописными буквами сочетание .ANT в расширении уже занято программой YO 354.
Но не знаю, совместимо ли применять сочетание строчными буквами .ant
Redoutable
16.08.2019, 20:47
Прописными буквами сочетание .ANT в расширении уже занято программой YO 354.
Но не знаю, совместимо ли применять сочетание строчными буквами .ant
БББлин! В этом мире все хорошие расширения уже заняты.(((
Смотрится для определённых случаев не плохо. Но явно надо компилятор *.maa > *.ant. Создавать антенны всё-таки удобнее и быстрее в "графической рисовалке". А вот для "сложных случаев" как раз не плохо иметь программный подход. Другими словами, я вижу такой use case: *maa > *.ant > *.maa.
Да, были такие мысли. Еще просится плагин для MMAN-ы, который бы кушал .ant. Еще лучше режим автоконтроля модификации открытого файла в MMAN-е. Как только файл изменен сторонними средствами MMANA должна автоматически считывать и отображать изменения. У меня есть своя программа которая всё это делает. Но ей до MMAN-ы как до луны.
U = 2, # Высота ножки
Лучше сделать это значение 0,2-0,3 - это ближе к правильному.
Да, спасибо. Я специально сделал ножку большой для наглядности.
Redoutable
19.08.2019, 16:56
# ВГДШ
ant (R = 2, L = 14, M = 2) # радиус, длина, отступ
{
C60 = cos (60) * R
S60 = sin (60) * R
<[-0.3,0,0] source (0.5,1,0) [+0.3,0,0]> # питание
<[0,-C60,S60][0,+C60,S60]> # поперечина
e = 1
repeat (2)
{
cnt = 1
alfa = 0
repeat (6)
{
<[L+M,0,0][L,R,0][5,R,0][5,C60,S60]> <[L,R,0][L,C60,S60]> # 6-гранник
if cnt <= 4 then
<[5,R,0][M,R,0][0.3,0,0]> # 4-гранник
if cnt <= 3 then
<[M,R,0][M,C60,-S60]> # ближний обод
if cnt <= 2 then
<[5,-C60,S60][0,-C60,S60]> # верхние продолины
fi fi fi
rotate (alfa,0,0)
alfa = alfa + 60
cnt = cnt + 1
}
<[M,+R,0][M,-R,0]> # поперечина
scale (e,1,1)
e = -1
}
}
238684
Прописными буквами сочетание .ANT в расширении уже занято программой YO 354.
Даже не вспомню такую версию YO. Сам пользуюсь 5-10 и 6-53. В них вроде таких расширений нет. Файлы с описанием антенны с расширением .yag
Да, конечно не у YO, а у YA 354 файлы с расширением .ant.
Не яги оптимизер, а яги анализер, типа того.
Redoutable
19.08.2019, 23:08
Может тогда сделать расширение .tna с заду-наперед чтобы ни с кем не пересекаться?
сделать расширение .tna с заду-наперед чтобы ни с кем не пересекаться?
Чтобы ни с кем не пересечься, нужно расширение сделать .ант (кириллицей) :)
P. S.
Файл TNA является одним из файлов категории . Его полное название это Topocad Net Adjustment. Формат файла TNA создан Adtollo.
Redoutable
27.08.2019, 00:25
Так на чем мы прошлый раз застряли? На расширениях файлов? Ну да и.. фиг с ними.
# Телебашня
ant ()
{
R1 = 5 # начальный радиус
H1 = 0 # начальная высота
N = 17 # число секторов
M = 15 # число ступеней
j = 0
repeat (M)
{
R2 = R1 * 0.9
H2 = H1 + 1
i = mod (j, 2) * 0.5
repeat (N)
{
a = 360 / N * (i - 0.5)
b = 360 / N * (i + 0.0)
c = 360 / N * (i + 0.5)
<[R1 * cos (a), R1 * sin (a), H1] [R2 * cos (b), R2 * sin (b), H2] [R1 * cos (c), R1 * sin (c), H1]>
i = i + 1
}
R1 = R2
H1 = H2
j = j + 1
}
}
Не скажу что получилась башня Шухова, но что-то поэтическое в этом есть.
239154
Redoutable
29.08.2019, 12:38
# Сектор сферы
ant ()
{
n = 15 # число нитей сетки
r = n / 1.1 # радиус сферы
x2 = -1; y2 = -1; z2 = -1
rr = r * r
x = (1 - n) / 2
repeat (n)
{
xx = x * x
z2 = -1
y = (1 - n) / 2
repeat (n)
{
yy = y * y
z = rr - xx - yy
if z << 0 then z = 0 else z = sqr (z) fi
if 0 <= z2 then
<[x2,y2,z2][x,y,z]> # продольная нитка
<[y2,x2,z2][y,x,z]> # поперечная
fi
x2 = x; y2 = y; z2 = z
y = y + 1
}
x = x + 1
}
}
239258
Redoutable
29.08.2019, 12:49
Приспособил под задачу ANT свою старую программу mn3see.exe. Программа позволяет визуализировать ANT-код, компилировать и локализовать ошибки. Ну и, естественно, обсчитывать движком mininec3. Так же имеется опция оперативной дозагрузки текущего отображаемого файла. Например, мы что-то поменяли в исходном ant или maa-файле. Программа mn3see это отслеживает и оперативно отображает.
СКАЧАТЬ >>> 239259 <<< СКАЧАТЬ
239260
Redoutable
29.08.2019, 13:10
Еще пару скринов:
239261
239262
Уважаемый Redoutable!
Давно мечтаю о том, чтобы кто-нибудь дерзнул распараллелить код MMANA. Так , чтобы процессор считал сразу всеми ядрами.
Как думаете, мечта моя несбыточна :s7:?
Redoutable
29.08.2019, 18:53
Не. Это тупиковая ветвь. Ну сколько там может быть этих ядер? Восемь? Лучше уж тогда считать на видеокарте как биткоин. Там этих сопроцессоров - тыщи! Во всяком случае, видеокарта GeForce GTX 690 имеет аж 3072 ядра! А это уже кое-что.
https://compua.com.ua/wp-content/uploads/2013/11/Nvidia-QUADRO.jpg
Redoutable
29.08.2019, 19:16
А этот монстер 8 x 3072 = 24576:
https://vse.kz/uploads/monthly_12_2016/post-20378-0-49550700-1481009645.jpg
Это тупиковая ветвь.
Проблема, как я понимая, не в количестве доступных ядер (в облаке их можно взять много с поминутной оплатой), а в том, что софт без рефакторинга не будет использовать доступные ресурсы и по прежнему будет работать на одном ядре. А source code MMANA недоступен, чтобы сделать какие-либо переделки.
Redoutable
29.08.2019, 20:27
Исходников ядер mininec и nec в сети как грязи. Я даже на исходник mman-ы натыкался, ещё на ипонском. Там, правда было внесено пару ошибок чтобы запутать следствие. Но они легко находятся и лечатся.
даже на исходник mman-ы натыкался, ещё на ипонском. Там, правда было внесено пару ошибок чтобы запутать следствие. Но они легко находятся и лечатся.
Ну тут вопрос насколько древний этот код. Последняя версия MMANA относительно стабильная. Брать какие-то исходники - это как минимум откат на несколько версий назад (скорее всего на ранние). А во-вторых, если автор против дать исходники на дальнейшую поддержку продукта, то с этим не поспоришь. Это его собственность.
Лучше уж тогда считать на видеокарте как биткоин. Там этих сопроцессоров - тыщи! Во всяком случае, видеокарта GeForce GTX 690 имеет аж 3072 ядра! А это уже кое-что.
Объясните, плс, если не сложно, мне, чайнику, как это сделать , имея обычное приложение.
Есть MMANA-GAL basic и ещё старая MMANA-rus.
Я почему-то думал всю жизнь, что для обсчётов при помощи видеокарты нужен также распараллеленный код.
Извините чайника ( в программировании), если что не так пишу.
П.С. Если предполагаете дальнейшее общение ( на форуме) , пожалуйста напишите Ваше имя.
Жутко не по себе иногда, когда не можешь по имени обратиться.
Redoutable
30.08.2019, 19:58
Конечно же, нужен специальный код https://ru.wikipedia.org/wiki/CUDA
CUDA SDK позволяет программистам реализовывать на специальных упрощённых диалектах языков программирования Си, C++ и Фортран алгоритмы, выполнимые на графических и тензорных процессорах Nvidia.
Это тупиковая ветвь. Ну сколько там может быть этих ядер? Восемь? Лучше уж тогда считать на видеокарте как биткоин. Там этих сопроцессоров - тыщи!
В "космосе" и ММАНА нормально посчитает.
Вот, еще бы, эта программа, по фотке крыши просчитывала окружающие "проволочины", арматуру здания, трубы отопления, мокрые деревья, выпавший снег, договаривалась с "дядей Петей" о допуске на крышу (указывая статью закона и пункт №...), находила бы магазины с минимальными ценами на материалы, сама закупала, печатала антенну на 3D принтере, подсказала контору с минимальными ценами на установку...
Так, что забыл? Ах... ДА!
Пусть, там... еще будет кластер и FT8 робот... который... сам сработает, отправит карточку, сам получит диплом/выиграет соревнования.
Мы, люди, слишком устали думать головой.... Не наше это... Мы, самое слабое звено.
Радиолюбительство и так катится к "биткоину". Закупил больше техники - получил выше место.
---------------
Вы... хотите нас лишить минимального кайфа от заморочек с понятием процесса изготовления/настройки/установки антенн?
Удовольствия: "Я, это сделал! Сам! Увидел ошибку, нашел выход, устранил проблемы, доработал... Кто молодец? Я молодец!"
Не надо будет "париться" на крыше, зимой... почему получилось КСВ 3? Всё косяки решит видеокарта?
Ей налить за хороший КСВ и ДН?:s10:
Да ну нафиг такой прогресс.
Весь кайф радиолюбительства - преодоление проблем. Иначе - интернет и нет проблем с связью, прохождением... "виртуальная шарманка".
Это, как альпинисту, предлагать подъём на вершину на вертолете, дайверу - подводная лодка, Конюхову перелететь через океан на самолете.
Не подумайте, что я... против прогресса и всего нового... Нет... Прогресс - сладок, заманчив. Подсядешь - ты "интеллектуальный труп".
Короче... я - ЗА, но... я против. :ржать:
Крик отчаяния, что следующие поколения... не будут думать вообще.:ржать:
Дожили...
https://www.youtube.com/watch?v=T7jRCeQPLPI
Конечно же, нужен специальный код
И я о том же. Насколько сложна эта задача, при условии, что исходник доступен?
Я почему-то думал всю жизнь, что для обсчётов при помощи видеокарты нужен также распараллеленный код.
ОФФ
Всё верно. И не только для видеокарты, а любой многопроцессорной системы. Как кто-то, где-то уже писал, многоядерность - это головная боль для программистов. Кроме операционной системы поддерживающей многопроцессорность, нужно ещё и собственный софт писать так, чтобы он умел использовать многопоточность, равномерно распределять задачи. И чтобы при этом софт работал действительно быстрее.
Объясните, плс, если не сложно, мне, чайнику, как это сделать , имея обычное приложение.
Есть MMANA-GAL basic и ещё старая MMANA-rus.
Я почему-то думал всю жизнь, что для обсчётов при помощи видеокарты нужен также распараллеленный код.
Владимир, Вы абсолютно верно рассуждаете. Что бы программа работала на нескольких процессорах - она должна уметь это делать. И как правило, это "умение" не доступно "программисту средней руки". Программа должна уметь делить задачу на параллельные потоки, которые будут исполняться на разных ядрах, а потом "собирать" их результаты вместе. Обработка данных на GPU (видеокартах) не сильно отличается от распараллеливания потоков на обычных процессорах. Единственое, что надо изучить дополнительное API для работы с GPU. Но для человека, который сможет составить алгоритм эффективного распараллеливания - это не проблема.
К сожалению, даже имея исходный код MMANA, не факт, что получится её переделать на многопроцессорную обработку, так как мы упрёмся в ядро, которое считает. А его исходный код мы точно не получим. Более того, такая "модернизация" софта - это очень большая работа и надо иметь очень хорошую мотивация этим заняться.
Вы... хотите нас лишить минимального кайфа от заморочек с понятием процесса изготовления/настройки/установки антенн?
Удовольствия: "Я, это сделал! Сам! Увидел ошибку, нашел выход, устранил проблемы, доработал... Кто молодец? Я молодец!"
Не надо будет "париться" на крыше, зимой...
Зачем мне проделывать сотню измерений, когда можно понять "поведение антенны" в софте????
не факт, что получится её переделать на многопроцессорную обработку, так как мы упрёмся в ядро, которое считает. А его исходный код мы точно не получим.
Вот, товарищ Redoutable пишет, что :
Исходников ядер mininec и nec в сети как грязи.
Ясное дело, что
такая "модернизация" софта - это очень большая работа и надо иметь очень хорошую мотивация этим заняться.
Но, вдруг удастся найти компетентного человека и понять, что ( сколько) он за это хочет.
Его преимущества: 1) Читаемость-наглядность; 2) Отсутствие тавтологий. 3) Свободный стиль изложения. 4) Комбинируемость элементов.
Никак не угомонитесь - Свежие версии и новости (http://dl2kq.de/forum/index.php/topic,115.msg5314.html#msg5314)
вдруг удастся найти компетентного человека и понять, что ( сколько) он за это хочет.
ОФФ
Ядро NEC2 уже давно переписано на язык Си с использованием многопоточности. Только другими авторами. Мир не сошелся на MMANA клином. Легче использовать другой моделировщик, тем более, как Вы уже написали, Вы готовы даже заплатить. Одним из таких я и пользуюсь (бесплатным). Включаю все свои 8 потоков и вуаля.
Какая разница, какой моделировщик использовать? MMANA - это всего лишь оболочка, облегчающая создание входных данных для ядер mininec и nec и обрабатывающая их выходные данные с целью предоставления результатов расчёта пользователю в удобоваримом виде. Я так понимаю, хотя я не кодер мманы и с её внутренностями не знаком.
PS: Владимир, Вы же в курсе, мы с Вами уже общались об этом в личке.
MMANA - это всего лишь оболочка, облегчающая создание входных данных для ядер mininec и nec и обрабатывающая их выходные данные с целью предоставления результатов расчёта пользователю в удобоваримом виде
А больше ничего и не нужно. Всего лишь...:)
ОФФ
Согласен. На мой взгляд, основное достоинство мманы это автоматическая сегментация избавляющая большое количество пользователей от головной боли, тем самым привлекая их. Как коммерческий продукт очень годно и выгодно.
Под "всего лишь" я имел ввиду, что нет смысла "распараллеливать" саму оболочку, ей и одного процессора хватит для быстродействия. Многопоточность нужна ядру NEC2, которое и производит основные вычисления.
Redoutable
31.08.2019, 15:46
У MMAN-ы ядро - MININEC. Распаралелливайте:
1 REM ****** MININEC(3) ********** NOSC CODE 822 (JCL CHANGE 9) 11-26-86
2 DEFINT I,J,K,N
3 DIM K!(6,2),Q(14)
4 REM ----- MAXIMUM NUMBER OF SEGMENTS (PULSES + 2 * WIRES) = 150
5 MS=150
6 DIM X(150),Y(150),Z(150)
7 REM ----- MAXIMUM NUMBER OF WIRES = 50
8 MW=50
9 DIM A(50),CA(50),CB(50),CG(50),J1(50),J2(50,2),N(50,2),S(50)
10 REM ----- MAXIMUM NUMBER OF LOADS = 11
11 ML=11
12 REM ----- MAXIMUM ORDER OF S-PARAMETER LOADS = 8
13 MA=8
14 DIM LA(2,11,8),LP(11),LS(11)
15 REM ----- MAXIMUM NUMBER OF MEDIA = 6
16 MM=6
17 REM ----- H MUST BE DIMENSIONED AT LEAST 6
18 DIM H(6),T(6),U(6),V(6),Z1(6),Z2(6)
19 REM ----- MAXIMUM NUMBER OF PULSES = 50
20 MP=50
21 DIM C%(50,2),CI(50),CR(50),P(50),W%(50)
22 DIM ZR(50,50),ZI(50,50)
23 REM ---- ARRAYS E,L & M DIMENSIONED TO MW+MP=100
24 DIM E(100),L(100),M(100)
25 COLOR 2,0
26 GOTO 1497
27 REM ********** KERNEL EVALUATION OF INTEGRALS I2 & I3 **********
28 IF K<0 THEN 33
29 X3=X2+T*(V1-X2)
30 Y3=Y2+T*(V2-Y2)
31 Z3=Z2+T*(V3-Z2)
32 GOTO 36
33 X3=V1+T*(X2-V1)
34 Y3=V2+T*(Y2-V2)
35 Z3=V3+T*(Z2-V3)
36 D3=X3*X3+Y3*Y3+Z3*Z3
37 REM ----- MOD FOR SMALL RADIUS TO WAVELENGTH RATIO
38 IF A(P4)<=SRM THEN D=SQR(D3):GOTO 49
39 D=D3+A2
40 IF D>0 THEN D=SQR(D)
41 REM ----- CRITERIA FOR USING REDUCED KERNEL
42 IF I6!=0 THEN 49
43 REM ----- EXACT KERNEL CALCULATION WITH ELLIPTIC INTEGRAL
44 B=D3/(D3+4*A2)
45 W0=C0+B*(C1+B*(C2+B*(C3+B*C4)))
46 W1=C5+B*(C6+B*(C7+B*(C8+B*C9)))
47 V0=(W0-W1*LOG(B))*SQR(1-B)
48 T3=T3+(V0+LOG(D3/(64*A2))/2)/P/A(P4)-1/D
49 B1=D*W
50 REM ----- EXP(-J*K*R)/R
51 T3=T3+COS(B1)/D
52 T4=T4-SIN(B1)/D
53 RETURN
54 REM ***** PSI(P1,P2,P3) = T1 + J * T2 **********
55 REM ----- ENTRIES REQUIRED FOR NEAR FIELD CALCULATION
56 X1=X0+P1*T5/2
57 Y1=Y0+P1*T6/2
58 Z1=Z0+P1*T7/2
59 X2=X1-X(P2)
60 Y2=Y1-Y(P2)
61 Z2=Z1-K*Z(P2)
62 V1=X1-X(P3)
63 V2=Y1-Y(P3)
64 V3=Z1-K*Z(P3)
65 GOTO 135
66 I4=INT(P2)
67 I5=I4+1
68 X2=X0-(X(I4)+X(I5))/2
69 Y2=Y0-(Y(I4)+Y(I5))/2
70 Z2=Z0-K*(Z(I4)+Z(I5))/2
71 V1=X0-X(P3)
72 V2=Y0-Y(P3)
73 V3=Z0-K*Z(P3)
74 GOTO 135
75 X2=X0-X(P2)
76 Y2=Y0-Y(P2)
77 Z2=Z0-K*Z(P2)
78 I4=INT(P3)
79 I5=I4+1
80 V1=X0-(X(I4)+X(I5))/2
81 V2=Y0-(Y(I4)+Y(I5))/2
82 V3=Z0-K*(Z(I4)+Z(I5))/2
83 GOTO 135
84 REM ----- ENTRIES REQUIRED FOR IMPEDANCE MATRIX CALCULATION
85 REM ----- S(M) GOES IN (X1,Y1,Z1) FOR SCALAR POTENTIAL
86 REM ----- MOD FOR SMALL RADIUS TO WAVE LENGTH RATIO
87 FVS=1
88 IF K<1 THEN 94
89 IF A(P4)>SRM THEN 94
90 IF (P3=P2+1 AND P1=(P2+P3)/2) THEN 91 ELSE 94
91 T1=2*LOG(S(P4)/A(P4))
92 T2=-W*S(P4)
93 RETURN
94 I4=INT(P1)
95 I5=I4+1
96 X1=(X(I4)+X(I5))/2
97 Y1=(Y(I4)+Y(I5))/2
98 Z1=(Z(I4)+Z(I5))/2
99 GOTO 113
100 REM ----- S(M) GOES IN (X1,Y1,Z1) FOR VECTOR POTENTIAL
101 REM ----- MOD FOR SMALL RADIUS TO WAVE LENGTH RATIO
102 FVS=0
103 IF K<1 THEN 109
104 IF A(P4)>=SRM THEN 109
105 IF (I=J AND P3=P2+.5) THEN 106 ELSE 109
106 T1=LOG(S(P4)/A(P4))
107 T2=-W*S(P4)/2
108 RETURN
109 X1=X(P1)
110 Y1=Y(P1)
111 Z1=Z(P1)
112 REM ----- S(U)-S(M) GOES IN (X2,Y2,Z2)
113 I4=INT(P2)
114 IF I4=P2 THEN 120
115 I5=I4+1
116 X2=(X(I4)+X(I5))/2-X1
117 Y2=(Y(I4)+Y(I5))/2-Y1
118 Z2=K*(Z(I4)+Z(I5))/2-Z1
119 GOTO 124
120 X2=X(P2)-X1
121 Y2=Y(P2)-Y1
122 Z2=K*Z(P2)-Z1
123 REM ----- S(V)-S(M) GOES IN (V1,V2,V3)
124 I4=INT(P3)
125 IF I4=P3 THEN 131
126 I5=I4+1
127 V1=(X(I4)+X(I5))/2-X1
128 V2=(Y(I4)+Y(I5))/2-Y1
129 V3=K*(Z(I4)+Z(I5))/2-Z1
130 GOTO 135
131 V1=X(P3)-X1
132 V2=Y(P3)-Y1
133 V3=K*Z(P3)-Z1
134 REM ----- MAGNITUDE OF S(U) - S(M)
135 D0=X2*X2+Y2*Y2+Z2*Z2
136 REM ----- MAGNITUDE OF S(V) - S(M)
137 IF D0>0 THEN D0=SQR(D0)
138 D3=V1*V1+V2*V2+V3*V3
139 IF D3>0 THEN D3=SQR(D3)
140 REM ----- SQUARE OF WIRE RADIUS
141 A2=A(P4)*A(P4)
142 REM ----- MAGNITUDE OF S(V) - S(U)
143 S4=(P3-P2)*S(P4)
144 REM ----- ORDER OF INTEGRATION
145 REM ----- LTH ORDER GAUSSIAN QUADRATURE
146 T1=0
147 T2=0
148 I6!=0
149 F2=1
150 L=7
151 T=(D0+D3)/S(P4)
152 REM ----- CRITERIA FOR EXACT KERNEL
153 IF T>1.1 THEN 165
154 IF C$="N" THEN 165
155 IF J2(W%(I),1)=J2(W%(J),1) THEN 160
156 IF J2(W%(I),1)=J2(W%(J),2) THEN 160
157 IF J2(W%(I),2)=J2(W%(J),1) THEN 160
158 IF J2(W%(I),2)=J2(W%(J),2) THEN 160
159 GOTO 165
160 IF A(P4)>SRM THEN 162
161 IF FVS=1 THEN 91 ELSE 106
162 F2=2*(P3-P2)
163 I6!=(1-LOG(S4/F2/8/A(P4)))/P/A(P4)
164 GOTO 167
165 IF T>6 THEN L=3
166 IF T>10 THEN L=1
167 I5=L+L
168 T3=0
169 T4=0
170 T=(Q(L)+.5)/F2
171 GOSUB 28
172 T=(.5-Q(L))/F2
173 GOSUB 28
174 L=L+1
175 T1=T1+Q(L)*T3
176 T2=T2+Q(L)*T4
177 L=L+1
178 IF L<I5 THEN 168
179 T1=S4*(T1+I6!)
180 T2=S4*T2
181 RETURN
182 REM ********** COMPLEX SQUARE ROOT **********
183 REM ----- W6+I*W7=SQR(Z6+I*Z7)
184 T6=SQR((ABS(Z6)+SQR(Z6*Z6+Z7*Z7))/2)
185 T7=ABS(Z7)/2/T6
186 IF Z6<0 THEN 191
187 W6=T6
188 W7=T7
189 IF Z7<0 THEN W7=-T7
190 RETURN
191 W6=T7
192 W7=T6
193 IF Z7<0 THEN W7=-T6
194 RETURN
195 REM ********** IMPEDANCE MATRIX CALCULATION **********
196 IF FLG=1 THEN 428
197 IF FLG=2 THEN 477
198 REM ----- BEGIN MATRIX FILL TIME CALCULATION
199 OT$=TIME$
200 Q$="MATRIX FILL "
201 PRINT
202 PRINT "BEGIN ";Q$
203 REM ----- ZERO IMPEDANCE MATRIX
204 FOR I=1 TO N
205 FOR J=1 TO N
206 ZR(I,J)=0
207 ZI(I,J)=0
208 NEXT J
209 NEXT I
210 REM ----- COMPUTE ROW I OF MATRIX (OBSERVATION LOOP)
211 FOR I=1 TO N
212 I1=ABS(C%(I,1))
213 I2=ABS(C%(I,2))
214 F4=SGN(C%(I,1))*S(I1)
215 F5=SGN(C%(I,2))*S(I2)
216 REM ----- R(M + 1/2) - R(M - 1/2) HAS COMPONENTS (T5,T6,T7)
217 T5=F4*CA(I1)+F5*CA(I2)
218 T6=F4*CB(I1)+F5*CB(I2)
219 T7=F4*CG(I1)+F5*CG(I2)
220 IF C%(I,1)=-C%(I,2) THEN T7=S(I1)*(CG(I1)+CG(I2))
221 REM ----- COMPUTE COLUMN J OF ROW I (SOURCE LOOP)
222 FOR J=1 TO N
223 J1=ABS(C%(J,1))
224 J2=ABS(C%(J,2))
225 F4=SGN(C%(J,1))
226 F5=SGN(C%(J,2))
227 F6=1
228 F7=1
229 REM ----- IMAGE LOOP
230 FOR K=1 TO G STEP -2
231 IF C%(J,1)<>-C%(J,2) THEN 235
232 IF K<0 THEN 332
233 F6=F4
234 F7=F5
235 F8=0
236 IF K<0 THEN 248
237 REM ----- SET FLAG TO AVOID REDUNANT CALCULATIONS
238 IF I1<>I2 THEN 246
239 IF (CA(I1)+CB(I1))=0 THEN 241
240 IF C%(I,1)<>C%(I,2) THEN 246
241 IF J1<>J2 THEN 246
242 IF (CA(J1)+CB(J1))=0 THEN 244
243 IF C%(J,1)<>C%(J,2) THEN 246
244 IF I1=J1 THEN F8=1
245 IF I=J THEN F8=2
246 IF ZR(I,J)<>0 THEN 317
247 REM ----- COMPUTE PSI(M,N,N+1/2)
248 P1=2*W%(I)+I-1
249 P2=2*W%(J)+J-1
250 P3=P2+.5
251 P4=J2
252 GOSUB 102
253 U1=F5*T1
254 U2=F5*T2
255 REM ----- COMPUTE PSI(M,N-1/2,N)
256 P3=P2
257 P2=P2-.5
258 P4=J1
259 IF F8<2 THEN GOSUB 102
260 V1=F4*T1
261 V2=F4*T2
262 REM ----- S(N+1/2)*PSI(M,N,N+1/2) + S(N-1/2)*PSI(M,N-1/2,N)
263 X3=U1*CA(J2)+V1*CA(J1)
264 Y3=U1*CB(J2)+V1*CB(J1)
265 Z3=(F7*U1*CG(J2)+F6*V1*CG(J1))*K
266 REM ----- REAL PART OF VECTOR POTENTIAL CONTRIBUTION
267 D1=W2*(X3*T5+Y3*T6+Z3*T7)
268 X3=U2*CA(J2)+V2*CA(J1)
269 Y3=U2*CB(J2)+V2*CB(J1)
270 Z3=(F7*U2*CG(J2)+F6*V2*CG(J1))*K
271 REM ----- IMAGINARY PART OF VECTOR POTENTIAL CONTRIBUTION
272 D2=W2*(X3*T5+Y3*T6+Z3*T7)
273 REM ----- COMPUTE PSI(M+1/2,N,N+1)
274 P1=P1+.5
275 IF F8=2 THEN P1=P1-1
276 P2=P3
277 P3=P3+1
278 P4=J2
279 IF F8<>1 THEN 283
280 U5=F5*U1+T1
281 U6=F5*U2+T2
282 GOTO 291
283 GOSUB 87
284 IF F8<2 THEN 288
285 U1=(2*T1-4*U1*F5)/S(J1)
286 U2=(2*T2-4*U2*F5)/S(J1)
287 GOTO 314
288 U5=T1
289 U6=T2
290 REM ----- COMPUTE PSI(M-1/2,N,N+1)
291 P1=P1-1
292 GOSUB 87
293 U1=(T1-U5)/S(J2)
294 U2=(T2-U6)/S(J2)
295 REM ----- COMPUTE PSI(M+1/2,N-1,N)
296 P1=P1+1
297 P3=P2
298 P2=P2-1
299 P4=J1
300 GOSUB 87
301 U3=T1
302 U4=T2
303 REM ----- COMPUTE PSI(M-1/2,N-1,N)
304 IF F8<1 THEN 308
305 T1=U5
306 T2=U6
307 GOTO 311
308 P1=P1-1
309 GOSUB 87
310 REM ----- GRADIENT OF SCALAR POTENTIAL CONTRIBUTION
311 U1=U1+(U3-T1)/S(J1)
312 U2=U2+(U4-T2)/S(J1)
313 REM ----- SUM INTO IMPEDANCE MATRIX
314 ZR(I,J)=ZR(I,J)+K*(D1+U1)
315 ZI(I,J)=ZI(I,J)+K*(D2+U2)
316 REM ----- AVOID REDUNANT CALCULATIONS
317 IF J<I THEN 332
318 IF F8=0 THEN 332
319 ZR(J,I)=ZR(I,J)
320 ZI(J,I)=ZI(I,J)
321 REM ----- SEGMENTS ON SAME WIRE SAME DISTANCE APART HAVE SAME Z
322 P1=J+1
323 IF P1>N THEN 332
324 IF C%(P1,1)<>C%(P1,2) THEN 332
325 IF C%(P1,2)=C%(J,2) THEN 328
326 IF C%(P1,2)<>-C%(J,2) THEN 332
327 IF (CA(J2)+CB(J2))<>0 THEN 332
328 P2=I+1
329 IF P2>N THEN 332
330 ZR(P2,P1)=ZR(I,J)
331 ZI(P2,P1)=ZI(I,J)
332 NEXT K
333 NEXT J
334 PCT=I/N
335 GOSUB 1599
336 NEXT I
337 REM ----- END MATRIX FILL TIME CALCULATION
338 T$=TIME$
339 GOSUB 1589
340 PRINT #3," "
341 PRINT #3,"FILL MATRIX : ";T$
342 REM ********** ADDITION OF LOADS **********
343 IF NL=0 THEN 377
344 F5=2*P*F
345 FOR I=1 TO NL
346 IF L$="N" THEN 366
347 REM ----- S-PARAMETER LOADS
348 U1=0
349 U2=0
350 D1=0
351 D2=0
352 S=1
353 FOR J=0 TO LS(I) STEP 2
354 U1=U1+LA(1,I,J)*S*F5^J
355 D1=D1+LA(2,I,J)*S*F5^J
356 L=J+1
357 U2=U2+LA(1,I,L)*S*F5^L
358 D2=D2+LA(2,I,L)*S*F5^L
359 S=-S
360 NEXT J
361 J=LP(I)
362 D=D1*D1+D2*D2
363 LI=(U2*D1-D2*U1)/D
364 LR=(U1*D1+U2*D2)/D
365 GOTO 369
366 LR=LA(1,I,1)
367 LI=LA(2,I,1)
368 J=LP(I)
369 F2=1/M
370 IF C%(J,1)<>-C%(J,2) THEN 372
371 IF K<0 THEN F2=2/M
372 ZR(J,J)=ZR(J,J)+F2*LI
373 ZI(J,J)=ZI(J,J)-F2*LR
374 NEXT I
375 REM ********** IMPEDANCE MATRIX FACTORIZATION **********
376 REM ----- BEGIN MATRIX FACTOR TIME CALCULATION
377 OT$=TIME$
378 Q$="FACTOR MATRIX"
379 PRINT
380 PRINT "BEGIN ";Q$;
381 X=N
382 PCTN=X*(X-1)*(X+X-1)
383 FOR K=1 TO N-1
384 REM ----- SEARCH FOR PIVOT
385 T=ZR(K,K)*ZR(K,K)+ZI(K,K)*ZI(K,K)
386 I1=K
387 FOR I=K+1 TO N
388 T1=ZR(I,K)*ZR(I,K)+ZI(I,K)*ZI(I,K)
389 IF T1<T THEN 392
390 I1=I
391 T=T1
392 NEXT I
393 REM ----- EXCHANGE ROWS K AND I1
394 IF I1=K THEN 403
395 FOR J=1 TO N
396 T1=ZR(K,J)
397 T2=ZI(K,J)
398 ZR(K,J)=ZR(I1,J)
399 ZI(K,J)=ZI(I1,J)
400 ZR(I1,J)=T1
401 ZI(I1,J)=T2
402 NEXT J
403 P(K)=I1
404 REM ----- SUBTRACT ROW K FROM ROWS K+1 TO N
405 FOR I=K+1 TO N
406 REM ----- COMPUTE MULTIPLIER L(I,K)
407 T1=(ZR(I,K)*ZR(K,K)+ZI(I,K)*ZI(K,K))/T
408 T2=(ZI(I,K)*ZR(K,K)-ZR(I,K)*ZI(K,K))/T
409 ZR(I,K)=T1
410 ZI(I,K)=T2
411 REM ----- SUBTRACT ROW K FROM ROW I
412 FOR J=K+1 TO N
413 ZR(I,J)=ZR(I,J)-(ZR(K,J)*T1-ZI(K,J)*T2)
414 ZI(I,J)=ZI(I,J)-(ZR(K,J)*T2+ZI(K,J)*T1)
415 NEXT J
416 NEXT I
417 X=N-K
418 PCT=1-X*(X-1)*(X+X-1)/PCTN
419 GOSUB 1599
420 NEXT K
421 REM ----- END MATRIX FACTOR TIME CALCULATION
422 T$=TIME$
423 GOSUB 1589
424 PRINT
425 PRINT #3, "FACTOR MATRIX: ";T$
426 REM ********** SOLVE **********
427 REM ----- COMPUTE RIGHT HAND SIDE
428 FOR I=1 TO N
429 CR(I)=0
430 CI(I)=0
431 NEXT I
432 FOR J=1 TO NS
433 F2=1/M
434 IF C%(E(J),1)=-C%(E(J),2) THEN F2=2/M
435 CR(E(J))=F2*M(J)
436 CI(E(J))=-F2*L(J)
437 NEXT J
438 REM ----- PERMUTE EXCITATION
439 FOR K=1 TO N-1
440 I1=P(K)
441 IF I1=K THEN 448
442 T1=CR(K)
443 T2=CI(K)
444 CR(K)=CR(I1)
445 CI(K)=CI(I1)
446 CR(I1)=T1
447 CI(I1)=T2
448 NEXT K
449 REM ----- FORWARD ELIMINATION
450 FOR I=2 TO N
451 T1=0
452 T2=0
453 FOR J=1 TO I-1
454 T1=T1+ZR(I,J)*CR(J)-ZI(I,J)*CI(J)
455 T2=T2+ZR(I,J)*CI(J)+ZI(I,J)*CR(J)
456 NEXT J
457 CR(I)=CR(I)-T1
458 CI(I)=CI(I)-T2
459 NEXT I
460 REM ----- BACK SUBSTITUTION
461 FOR I=N TO 1 STEP -1
462 T1=0
463 T2=0
464 IF I=N THEN 469
465 FOR J=I+1 TO N
466 T1=T1+ZR(I,J)*CR(J)-ZI(I,J)*CI(J)
467 T2=T2+ZR(I,J)*CI(J)+ZI(I,J)*CR(J)
468 NEXT J
469 T=ZR(I,I)*ZR(I,I)+ZI(I,I)*ZI(I,I)
470 T1=CR(I)-T1
471 T2=CI(I)-T2
472 CR(I)=(T1*ZR(I,I)+T2*ZI(I,I))/T
473 CI(I)=(T2*ZR(I,I)-T1*ZI(I,I))/T
474 NEXT I
475 FLG=2
476 REM ********** SOURCE DATA **********
477 PRINT #3," "
478 PRINT #3,B$;" SOURCE DATA ";B$
479 PWR=0
480 FOR I=1 TO NS
481 CR=CR(E(I))
482 CI=CI(E(I))
483 T=CR*CR+CI*CI
484 T1=(L(I)*CR+M(I)*CI)/T
485 T2=(M(I)*CR-L(I)*CI)/T
486 O2=(L(I)*CR+M(I)*CI)/2
487 PWR=PWR+O2
488 PRINT #3,"PULSE ";E(I),"VOLTAGE = (";L(I);",";M(I);"J)"
489 PRINT #3," ","CURRENT = (";CR;",";CI;"J)"
490 PRINT #3," ","IMPEDANCE = (";T1;",";T2;"J)"
491 PRINT #3," ","POWER = ";O2;" WATTS"
492 NEXT I
493 IF NS>1 THEN PRINT #3," "
494 IF NS>1 THEN PRINT #3,"TOTAL POWER = ";PWR;"WATTS"
495 RETURN
496 REM ********** PRINT CURRENTS **********
497 GOSUB 196
498 S$="N"
499 PRINT #3, " "
500 PRINT #3,B$;" CURRENT DATA ";B$
501 FOR K=1 TO NW
502 IF S$="Y" THEN 507
503 PRINT #3, " "
504 PRINT #3, "WIRE NO. ";K;":"
505 PRINT #3, "PULSE","REAL","IMAGINARY","MAGNITUDE","PHASE"
506 PRINT #3, " NO.","(AMPS)","(AMPS)","(AMPS)","(DEGREES)"
507 N1=N(K,1)
508 N2=N(K,2)
509 I=N1
510 C=C%(I,1)
511 IF (N1=0 AND N2=0) THEN C=K
512 IF G=1 THEN 515
513 IF (J1(K)=-1 AND N1>N2) THEN N2=N1
514 IF J1(K)=-1 THEN 525
515 E%=1
516 GOSUB 572
517 I2!=I1!
518 J2!=J1!
519 GOSUB 607
520 IF S$="N" THEN PRINT #3, I$,I1!;TAB(29);J1!;TAB(43);S1;TAB(57);S2
521 IF S$="Y" THEN PRINT #1,I1!;",";J1!;",";S1;",";S2
522 IF N1=0 THEN 532
523 IF C=K THEN 525
524 IF I$="J" THEN N1=N1+1
525 FOR I=N1 TO N2-1
526 I2!=CR(I)
527 J2!=CI(I)
528 GOSUB 607
529 IF S$="N" THEN PRINT #3, I,CR(I);TAB(29);CI(I);TAB(43);S1;TAB(57);S2
530 IF S$="Y" THEN PRINT #1,CR(I);",";CI(I);",";S1;",";S2
531 NEXT I
532 I=N2
533 C=C%(I,2)
534 IF (N1=0 AND N2=0) THEN C=K
535 IF G=1 THEN 537
536 IF J1(K)=1 THEN 543
537 E%=2
538 GOSUB 572
539 IF (N1=0 AND N2=0) THEN 549
540 IF N1>N2 THEN 549
541 IF C=K THEN 543
542 IF I$="J" THEN 549
543 I2!=CR(N2)
544 J2!=CI(N2)
545 GOSUB 607
546 IF S$="N" THEN PRINT #3, N2,CR(N2);TAB(29);CI(N2);TAB(43);S1;TAB(57);S2
547 IF S$="Y" THEN PRINT #1,CR(N2);",";CI(N2);",";S1;",";S2
548 IF J1(K)=1 THEN 554
549 I2!=I1!
550 J2!=J1!
551 GOSUB 607
552 IF S$="N" THEN PRINT #3,I$,I1!;TAB(29);J1!;TAB(43);S1;TAB(57);S2
553 IF S$="Y" THEN PRINT #1,I1!;",";J1!;",";S1;",";S2
554 IF S$="Y" THEN PRINT #1," 1 , 1 , 1 , 1"
555 NEXT K
556 IF S$="Y" THEN 569
557 PRINT
558 INPUT "SAVE CURRENTS TO A FILE (Y/N) ";S$
559 IF S$="N" THEN 570
560 IF S$<>"Y" THEN 557
561 PRINT #3," "
562 INPUT "FILENAME (NAME.OUT) ";F$
563 IF LEFT$(RIGHT$(F$,4),1)="." THEN 564 ELSE F$=F$+".OUT"
564 IF O$>"C" THEN PRINT #3,"FILENAME (NAME.OUT): ";F$
565 OPEN F$ FOR OUTPUT AS #1
566 PRINT #3," "
567 PRINT #1,NW;",";PWR;",C"
568 GOTO 501
569 CLOSE #1
570 RETURN
571 REM ----- SORT JUNCTION CURRENTS
572 I$="E"
573 I1!=0!
574 J1!=0!
575 IF (C=K OR C=0) THEN 580
576 I$="J"
577 I1!=CR(I)
578 J1!=CI(I)
579 REM ----- CHECK FOR OTHER OVERLAPPING WIRES
580 FOR J=1 TO NW
581 IF J=K GOTO 604
582 L1=N(J,1)
583 L2=N(J,2)
584 IF E%=2 THEN 590
585 CO=C%(L1,1)
586 CT=C%(L2,2)
587 L3=L1
588 L4=L2
589 GOTO 594
590 CO=C%(L2,2)
591 CT=C%(L1,1)
592 L3=L2
593 L4=L1
594 IF CO=-K THEN 596
595 GOTO 599
596 I1!=I1!-CR(L3)
597 J1!=J1!-CI(L3)
598 I$="J"
599 IF CT=K THEN 601
600 GOTO 604
601 I1!=I1!+CR(L4)
602 J1!=J1!+CI(L4)
603 I$="J"
604 NEXT J
605 RETURN
606 REM ----- CALCULATE S1 AND S2
607 I3!=I2!*I2!
608 J3!=J2!*J2!
609 IF (I3!>0 OR J3!>0) THEN 612
610 S1=0!
611 GOTO 613
612 S1=SQR(I3!+J3!)
613 IF I2!><0 THEN 616
614 S2=0!
615 RETURN
616 S2=ATN(J2!/I2!)/P0
617 IF I2!>0 THEN RETURN
618 S2=S2+SGN(J2!)*180
619 RETURN
620 REM ********** FAR FIELD CALCULATION **********
621 IF FLG<2 THEN GOSUB 196
622 O2=PWR
623 REM ----- TABULATE IMPEDANCE
624 IF NM=0 THEN 634
625 FOR I=1 TO NM
626 Z6=T(I)
627 Z7=-V(I)/(2*P*F*8.85E-06)
628 REM ----- FORM IMPEDANCE=1/SQR(DIELECTRIC CONSTANT)
629 GOSUB 184
630 D=W6*W6+W7*W7
631 Z1(I)=W6/D
632 Z2(I)=-W7/D
633 NEXT I
634 PRINT #3," "
635 PRINT #3,B$;" FAR FIELD ";B$
636 PRINT #3," "
637 REM ----- INPUT VARIABLES FOR FAR FIELD CALCULATION
638 INPUT "CALCULATE PATTERN IN DBI OR VOLTS/METER (D/V)";P$
639 IF P$="D" THEN 655
640 IF P$<>"V" THEN 638
641 F1=1
642 PRINT
643 PRINT "PRESENT POWER LEVEL = ";PWR;" WATTS"
644 INPUT "CHANGE POWER LEVEL (Y/N) ";A$
645 IF A$="N" THEN 650
646 IF A$<>"Y" THEN 644
647 INPUT "NEW POWER LEVEL (WATTS) ";O2
648 IF O$>"C" THEN PRINT #3,"NEW POWER LEVEL = ";O2
649 GOTO 644
650 IF (O2<0 OR O2=0) THEN O2=PWR
651 F1=SQR(O2/PWR)
652 PRINT
653 INPUT "RADIAL DISTANCE (METERS) ";RD
654 IF RD<0 THEN RD=0
655 A$="ZENITH ANGLE : INITIAL,INCREMENT,NUMBER"
656 PRINT A$;
657 INPUT ZA,ZC,NZ
658 IF NZ=0 THEN NZ=1
659 IF O$>"C" THEN PRINT #3,A$;": ";ZA;",";ZC;",";NZ
660 A$="AZIMUTH ANGLE: INITIAL,INCREMENT,NUMBER"
661 PRINT A$;
662 INPUT AA,AC,NA
663 IF NA=0 THEN NA=1
664 IF O$>"C" THEN PRINT #3,A$;": ";AA;",";AC;",";NA
665 PRINT #3," "
666 REM ********** FILE FAR FIELD DATA **********
667 INPUT "FILE PATTERN (Y/N)";S$
668 IF S$="N" THEN 676
669 IF S$<>"Y" THEN 667
670 PRINT #3," "
671 INPUT "FILENAME (NAME.OUT)";F$
672 IF LEFT$(RIGHT$(F$,4),1)="." THEN 673 ELSE F$=F$+".OUT"
673 IF O$>"C" THEN PRINT #3,"FILENAME (NAME.OUT): ";F$
674 OPEN F$ FOR OUTPUT AS #1
675 PRINT #1,NA*NZ;",";O2;",";P$
676 PRINT #3, " "
677 K9!=.016678/PWR
678 REM ----- PATTERN HEADER
679 PRINT #3,B$;" PATTERN DATA ";B$
680 IF P$="V" GOTO 685
681 PRINT #3,"ZENITH","AZIMUTH","VERTICAL","HORIZONTAL","TOTAL"
682 A$="PATTERN (DB)"
683 PRINT #3," ANGLE"," ANGLE",A$,A$,A$
684 GOTO 692
685 IF RD>0 THEN PRINT #3,TAB(15);"RADIAL DISTANCE = ";RD;" METERS"
686 PRINT #3,TAB(15);"POWER LEVEL = ";PWR*F1*F1;" WATTS"
687 PRINT #3,"ZENITH AZIMUTH"," E(THETA) "," E(PHI)"
688 A$=" MAG(V/M) PHASE(DEG)"
689 PRINT #3," ANGLE ANGLE",A$,A$
690 IF S$="Y" THEN PRINT #1,RD
691 REM ----- LOOP OVER AZIMUTH ANGLE
692 Q1=AA
693 FOR I1=1 TO NA
694 U3=Q1*P0
695 V1=-SIN(U3)
696 V2=COS(U3)
697 REM ----- LOOP OVER ZENITH ANGLE
698 Q2=ZA
699 FOR I2=1 TO NZ
700 U4=Q2*P0
701 R3=COS(U4)
702 T3=-SIN(U4)
703 T1=R3*V2
704 T2=-R3*V1
705 R1=-T3*V2
706 R2=T3*V1
707 X1=0
708 Y1=0
709 Z1=0
710 X2=0
711 Y2=0
712 Z2=0
713 REM ----- IMAGE LOOP
714 FOR K=1 TO G STEP -2
715 FOR I=1 TO N
716 IF K>0 THEN 718
717 IF C%(I,1)=-C%(I,2) THEN 813
718 J=2*W%(I)-1+I
719 REM ----- FOR EACH END OF PULSE COMPUTE A CONTRIBUTION TO E-FIELD
720 FOR F5=1 TO 2
721 L=ABS(C%(I,F5))
722 F3=SGN(C%(I,F5))*W*S(L)/2
723 IF C%(I,1)<>-C%(I,2) THEN 725
724 IF F3<0 THEN 812
725 IF K=1 THEN 728
726 IF NM<>0 THEN 747
727 REM ----- STANDARD CASE
728 S2=W*(X(J)*R1+Y(J)*R2+Z(J)*K*R3)
729 S1=COS(S2)
730 S2=SIN(S2)
731 B1=F3*(S1*CR(I)-S2*CI(I))
732 B2=F3*(S1*CI(I)+S2*CR(I))
733 IF C%(I,1)=-C%(I,2) THEN 742
734 X1=X1+K*B1*CA(L)
735 X2=X2+K*B2*CA(L)
736 Y1=Y1+K*B1*CB(L)
737 Y2=Y2+K*B2*CB(L)
738 Z1=Z1+B1*CG(L)
739 Z2=Z2+B2*CG(L)
740 GOTO 812
741 REM ----- GROUNDED ENDS
742 Z1=Z1+2*B1*CG(L)
743 Z2=Z2+2*B2*CG(L)
744 GOTO 812
745 REM ----- REAL GROUND CASE
746 REM ----- BEGIN BY FINDING SPECULAR DISTANCE
747 T4=100000!
748 IF R3=0 THEN 750
749 T4=-Z(J)*T3/R3
750 B9=T4*V2+X(J)
751 IF TB=1 THEN 755
752 B9=B9*B9+(Y(J)-T4*V1)^2
753 IF B9>0 THEN B9=SQR(B9) ELSE 755
754 REM ----- SEARCH FOR THE CORRESPONDING MEDIUM
755 J2=NM
756 FOR J1=NM TO 1 STEP -1
757 IF B9>U(J1) THEN 759
758 J2=J1
759 NEXT J1
760 REM ----- OBTAIN IMPEDANCE AT SPECULAR POINT
761 Z4=Z1(J2)
762 Z5=Z2(J2)
763 REM ----- IF PRESENT INCLUDE GROUND SCREEN IMPEDANCE IN PARALLEL
764 IF NR=0 THEN 776
765 IF B9>U(1) THEN 776
766 R=B9+NR*RR
767 Z8=W*R*LOG(R/(NR*RR))/NR
768 S8=-Z5*Z8
769 S9=Z4*Z8
770 T8=Z4
771 T9=Z5+Z8
772 D=T8*T8+T9*T9
773 Z4=(S8*T8+S9*T9)/D
774 Z5=(S9*T8-S8*T9)/D
775 REM ----- FORM SQR(1-Z^2*SIN^2)
776 Z6=1-(Z4*Z4-Z5*Z5)*T3*T3
777 Z7=-(2*Z4*Z5)*T3*T3
778 GOSUB 184
779 REM ----- VERTICAL REFLECTION COEFFICIENT
780 S8=R3-(W6*Z4-W7*Z5)
781 S9=-(W6*Z5+W7*Z4)
782 T8=R3+(W6*Z4-W7*Z5)
783 T9=W6*Z5+W7*Z4
784 D=T8*T8+T9*T9
785 V8=(S8*T8+S9*T9)/D
786 V9=(S9*T8-S8*T9)/D
787 REM ----- HORIZONTAL REFLECTION COEFFICIENT
788 S8=W6-R3*Z4
789 S9=W7-R3*Z5
790 T8=W6+R3*Z4
791 T9=W7+R3*Z5
792 D=T8*T8+T9*T9
793 H8=(S8*T8+S9*T9)/D-V8
794 H9=(S9*T8-S8*T9)/D-V9
795 REM ----- COMPUTE CONTRIBUTION TO SUM
796 S2=W*(X(J)*R1+Y(J)*R2-(Z(J)-2*H(J2))*R3)
797 S1=COS(S2)
798 S2=SIN(S2)
799 B1=F3*(S1*CR(I)-S2*CI(I))
800 B2=F3*(S1*CI(I)+S2*CR(I))
801 W6=B1*V8-B2*V9
802 W7=B1*V9+B2*V8
803 D=CA(L)*V1+CB(L)*V2
804 Z6=D*(B1*H8-B2*H9)
805 Z7=D*(B1*H9+B2*H8)
806 X1=X1-(CA(L)*W6+V1*Z6)
807 X2=X2-(CA(L)*W7+V1*Z7)
808 Y1=Y1-(CB(L)*W6+V2*Z6)
809 Y2=Y2-(CB(L)*W7+V2*Z7)
810 Z1=Z1+CG(L)*W6
811 Z2=Z2+CG(L)*W7
812 NEXT F5
813 NEXT I
814 NEXT K
815 H2=-(X1*T1+Y1*T2+Z1*T3)*G0
816 H1=(X2*T1+Y2*T2+Z2*T3)*G0
817 X4=-(X1*V1+Y1*V2)*G0
818 X3=(X2*V1+Y2*V2)*G0
819 IF P$="D" THEN 827
820 IF RD=0 THEN 842
821 H1=H1/RD
822 H2=H2/RD
823 X3=X3/RD
824 X4=X4/RD
825 GOTO 842
826 REM ----- PATTERN IN DB
827 P1=-999
828 P2=P1
829 P3=P1
830 T1=K9!*(H1*H1+H2*H2)
831 T2=K9!*(X3*X3+X4*X4)
832 T3=T1+T2
833 REM ----- CALCULATE VALUES IN DB
834 IF T1>1E-30 THEN P1=4.343*LOG(T1)
835 IF T2>1E-30 THEN P2=4.343*LOG(T2)
836 IF T3>1E-30 THEN P3=4.343*LOG(T3)
837 PRINT #3,Q2;TAB(15);Q1;TAB(29);P1;TAB(43);P2;TAB(57);P3
838 IF S$="Y" THEN PRINT #1,Q2;",";Q1;",";P1;",";P2;",";P3
839 GOTO 866
840 REM ----- PATTERN IN VOLTS/METER
841 REM ----- MAGNITUDE AND PHASE OF E(THETA)
842 S1=0
843 IF (H1=0 AND H2=0) THEN 845
844 S1=SQR(H1*H1+H2*H2)
845 IF H1><0 THEN 848
846 S2=0
847 GOTO 851
848 S2=ATN(H2/H1)/P0
849 IF H1<0 THEN S2=S2+SGN(H2)*180
850 REM ----- MAGNITUDE AND PHASE OF E(PHI)
851 S3=0
852 IF (X3=0 AND X4=0) THEN 854
853 S3=SQR(X3*X3+X4*X4)
854 IF X3><0 THEN 857
855 S4=0
856 GOTO 859
857 S4=ATN(X4/X3)/P0
858 IF X3<0 THEN S4=S4+SGN(X4)*180
859 PRINT #3,USING "###.## ";Q2,Q1;
860 PRINT #3,USING " ##.###^^^^";S1*F1;
861 PRINT #3,USING " ###.## ";S2;
862 PRINT #3,USING " ##.###^^^^";S3*F1;
863 PRINT #3,USING " ###.##";S4
864 IF S$="Y" THEN PRINT #1,Q2;",";Q1;",";S1*F1;",";S2;",";S3*F1;","S4
865 REM ----- INCREMENT ZENITH ANGLE
866 Q2=Q2+ZC
867 NEXT I2
868 REM ----- INCREMENT AZIMUTH ANGLE
869 Q1=Q1+AC
870 NEXT I1
871 CLOSE #1
872 RETURN
873 REM ********** NEAR FIELD CALCULATION **********
874 REM ----- ENSURE CURRENTS HAVE BEEN CALCULATED
875 IF FLG<2 THEN GOSUB 196
876 O2=PWR
877 PRINT #3," "
878 PRINT #3,B$;" NEAR FIELDS ";B$
879 PRINT #3," "
880 INPUT "ELECTRIC OR MAGNETIC NEAR FIELDS (E/H) ";N$
881 IF(N$="H" OR N$="E") GOTO 883
882 GOTO 880
883 PRINT
884 REM ----- INPUT VARIABLES FOR NEAR FIELD CALCULATION
885 PRINT "FIELD LOCATION(S):"
886 A$="-COORDINATE (M): INITIAL,INCREMENT,NUMBER "
887 PRINT " X";A$;
888 INPUT XI,XC,NX
889 IF NX=0 THEN NX=1
890 IF O$>"C" THEN PRINT #3,"X";A$;": ";XI;",";XC;",";NX
891 PRINT " Y";A$;
892 INPUT YI,YC,NY
893 IF NY=0 THEN NY=1
894 IF O$>"C" THEN PRINT #3,"Y";A$;": ";YI;",";YC;",";NY
895 PRINT " Z";A$;
896 INPUT ZI,ZC,NZ
897 IF NZ=0 THEN NZ=1
898 IF O$>"C" THEN PRINT #3,"Z";A$;": ";ZI;",";ZC;",";NZ
899 F1=1
900 PRINT
901 PRINT "PRESENT POWER LEVEL IS ";PWR;" WATTS"
902 INPUT "CHANGE POWER LEVEL (Y/N) ";A$
903 IF A$="N" THEN 908
904 IF A$<>"Y" THEN 902
905 INPUT "NEW POWER LEVEL (WATTS) ";O2
906 IF O$>"C" THEN PRINT #3," ":PRINT #3,"NEW POWER LEVEL (WATTS) = ";O2
907 GOTO 902
908 IF (O2<0 OR O2=0) THEN O2=PWR
909 REM ----- RATIO OF POWER LEVELS
910 F1=SQR(O2/PWR)
911 IF N$="H" THEN F1=F1/S0/4/P
912 PRINT
913 REM ----- DESIGNATION OF OUTPUT FILE FOR NEAR FIELD DATA
914 INPUT "SAVE TO A FILE (Y/N) ";S$
915 IF S$="N" THEN 923
916 IF S$<>"Y" THEN 914
917 INPUT "FILENAME (NAME.OUT) ";F$
918 IF LEFT$(RIGHT$(F$,4),1)="." THEN 919 ELSE F$=F$+".OUT"
919 IF O$>"C" THEN PRINT #3," ":PRINT #3,"FILENAME (NAME.OUT) ";F$
920 OPEN F$ FOR OUTPUT AS #2
921 PRINT #2,NX*NY*NZ;",";O2;",";N$
922 REM ----- LOOP OVER Z DIMENSION
923 FOR IZ=1 TO NZ
924 ZZ=ZI+(IZ-1)*ZC
925 REM ----- LOOP OVER Y DIMENSION
926 FOR IY=1 TO NY
927 YY=YI+(IY-1)*YC
928 REM ----- LOOP OVER X DIMENSION
929 FOR IX=1 TO NX
930 XX=XI+(IX-1)*XC
931 REM ----- NEAR FIELD HEADER
932 PRINT #3," "
933 IF N$="E" THEN PRINT #3,B$;"NEAR ELECTRIC FIELDS";B$
934 IF N$="H" THEN PRINT #3,B$;"NEAR MAGNETIC FIELDS";B$
935 PRINT #3,TAB(10);"FIELD POINT: ";"X = ";XX;" Y = ";YY;" Z = ";ZZ
936 PRINT #3," VECTOR","REAL","IMAGINARY","MAGNITUDE","PHASE"
937 IF N$="E" THEN A$=" V/M "
938 IF N$="H" THEN A$=" AMPS/M "
939 PRINT #3," COMPONENT ",A$,A$,A$," DEG"
940 A1=0
941 A3=0
942 A4=0
943 REM ----- LOOP OVER THREE VECTOR COMPONENTS
944 FOR I=1 TO 3
945 X0=XX
946 Y0=YY
947 Z0=ZZ
948 IF N$="H" THEN 958
949 T5=0
950 T6=0
951 T7=0
952 IF I=1 THEN T5=2*S0
953 IF I=2 THEN T6=2*S0
954 IF I=3 THEN T7=2*S0
955 U7=0
956 U8=0
957 GOTO 968
958 FOR J8=1 TO 6
959 K!(J8,1)=0
960 K!(J8,2)=0
961 NEXT J8
962 J9=1
963 J8=-1
964 IF I=1 THEN X0=XX+J8*S0/2
965 IF I=2 THEN Y0=YY+J8*S0/2
966 IF I=3 THEN Z0=ZZ+J8*S0/2
967 REM ----- LOOP OVER SOURCE SEGMENTS
968 FOR J=1 TO N
969 J1=ABS(C%(J,1))
970 J2=ABS(C%(J,2))
971 J3=J2
972 IF J1>J2 THEN J3=J1
973 F4=SGN(C%(J,1))
974 F5=SGN(C%(J,2))
975 F6=1
976 F7=1
977 U5=0
978 U6=0
979 REM ----- IMAGE LOOP
980 FOR K=1 TO G STEP -2
981 IF C%(J,1)<>-C%(J,2) THEN 987
982 IF K<0 THEN 1048
983 REM ----- COMPUTE VECTOR POTENTIAL A
984 F6=F4
985 F7=F5
986 REM ----- COMPUTE PSI(0,J,J+.5)
987 P1=0
988 P2=2*J3+J-1
989 P3=P2+.5
990 P4=J2
991 GOSUB 75
992 U1=T1*F5
993 U2=T2*F5
994 REM ----- COMPUTE PSI(0,J-.5,J)
995 P3=P2
996 P2=P2-.5
997 P4=J1
998 GOSUB 66
999 V1=F4*T1
1000 V2=F4*T2
1001 REM ----- REAL PART OF VECTOR POTENTIAL CONTRIBUTION
1002 X3=U1*CA(J2)+V1*CA(J1)
1003 Y3=U1*CB(J2)+V1*CB(J1)
1004 Z3=(F7*U1*CG(J2)+F6*V1*CG(J1))*K
1005 REM ----- IMAGINARY PART OF VECTOR POTENTIAL CONTRIBUTION
1006 X5=U2*CA(J2)+V2*CA(J1)
1007 Y5=U2*CB(J2)+V2*CB(J1)
1008 Z5=(F7*U2*CG(J2)+F6*V2*CG(J1))*K
1009 REM ----- MAGNETIC FIELD CALCULATION COMPLETED
1010 IF N$="H" THEN 1042
1011 D1=(X3*T5+Y3*T6+Z3*T7)*W2
1012 D2=(X5*T5+Y5*T6+Z5*T7)*W2
1013 REM ----- COMPUTE PSI(.5,J,J+1)
1014 P1=.5
1015 P2=P3
1016 P3=P3+1
1017 P4=J2
1018 GOSUB 56
1019 U1=T1
1020 U2=T2
1021 REM ----- COMPUTE PSI(-.5,J,J+1)
1022 P1=-P1
1023 GOSUB 56
1024 U1=(T1-U1)/S(J2)
1025 U2=(T2-U2)/S(J2)
1026 REM ----- COMPUTE PSI(.5,J-1,J)
1027 P1=-P1
1028 P3=P2
1029 P2=P2-1
1030 P4=J1
1031 GOSUB 56
1032 U3=T1
1033 U4=T2
1034 REM ----- COMPUTE PSI(-.5,J-1,J)
1035 P1=-P1
1036 GOSUB 56
1037 REM ----- GRADIENT OF SCALAR POTENTIAL
1038 U5=(U1+(U3-T1)/S(J1)+D1)*K+U5
1039 U6=(U2+(U4-T2)/S(J1)+D2)*K+U6
1040 GOTO 1048
1041 REM ----- COMPONENTS OF VECTOR POTENTIAL A
1042 K!(1,J9)=K!(1,J9)+(X3*CR(J)-X5*CI(J))*K
1043 K!(2,J9)=K!(2,J9)+(X5*CR(J)+X3*CI(J))*K
1044 K!(3,J9)=K!(3,J9)+(Y3*CR(J)-Y5*CI(J))*K
1045 K!(4,J9)=K!(4,J9)+(Y5*CR(J)+Y3*CI(J))*K
1046 K!(5,J9)=K!(5,J9)+(Z3*CR(J)-Z5*CI(J))*K
1047 K!(6,J9)=K!(6,J9)+(Z5*CR(J)+Z3*CI(J))*K
1048 NEXT K
1049 IF N$="H" THEN 1052
1050 U7=U5*CR(J)-U6*CI(J)+U7
1051 U8=U6*CR(J)+U5*CI(J)+U8
1052 NEXT J
1053 IF N$="E" THEN 1075
1054 REM ----- DIFFERENCES OF VECTOR POTENTIAL A
1055 J8=1
1056 J9=J9+1
1057 IF J9=2 THEN 964
1058 ON I GOTO 1059,1064,1069
1059 H(3)=K!(5,1)-K!(5,2)
1060 H(4)=K!(6,1)-K!(6,2)
1061 H(5)=K!(3,2)-K!(3,1)
1062 H(6)=K!(4,2)-K!(4,1)
1063 GOTO 1097
1064 H(1)=K!(5,2)-K!(5,1)
1065 H(2)=K!(6,2)-K!(6,1)
1066 H(5)=H(5)-K!(1,2)+K!(1,1)
1067 H(6)=H(6)-K!(2,2)+K!(2,1)
1068 GOTO 1097
1069 H(1)=H(1)-K!(3,2)+K!(3,1)
1070 H(2)=H(2)-K!(4,2)+K!(4,1)
1071 H(3)=H(3)+K!(1,2)-K!(1,1)
1072 H(4)=H(4)+K!(2,2)-K!(2,1)
1073 GOTO 1097
1074 REM ----- IMAGINARY PART OF ELECTRIC FIELD
1075 U7=-M*U7/S0
1076 REM ----- REAL PART OF ELECTRIC FIELD
1077 U8=M*U8/S0
1078 REM ----- MAGNITUDE AND PHASE CALCULATION
1079 S1=0
1080 IF (U7=0 AND U8=0) THEN 1082
1081 S1=SQR(U7*U7+U8*U8)
1082 S2=0
1083 IF U8<>0 THEN S2=ATN(U7/U8)/P0
1084 IF U8>0 THEN 1086
1085 S2=S2+SGN(U7)*180
1086 IF I=1 THEN PRINT #3," X ",
1087 IF I=2 THEN PRINT #3," Y ",
1088 IF I=3 THEN PRINT #3," Z ",
1089 PRINT #3,TAB(15);F1*U8;TAB(29);F1*U7;TAB(43);F1*S1;TAB(57);S2
1090 IF S$="Y" THEN PRINT #2,F1*U8;",";F1*U7;",";F1*S1;",";S2
1091 REM ----- CALCULATION FOR PEAK ELECTRIC FIELD
1092 S1=S1*S1
1093 S2=S2*P0
1094 A1=A1+S1*COS(2*S2)
1095 A3=A3+S1*SIN(2*S2)
1096 A4=A4+S1
1097 NEXT I
1098 IF N$="E" THEN 1121
1099 REM ----- MAGNETIC FIELD MAGNITUDE AND PHASE CALCULATION
1100 FOR I=1 TO 5 STEP 2
1101 S1=0
1102 IF (H(I)=0 AND H(I+1)=0) THEN 1104
1103 S1=SQR(H(I)*H(I)+H(I+1)*H(I+1))
1104 S2=0
1105 IF H(I)<>0 THEN S2=ATN(H(I+1)/H(I))/P0
1106 IF H(I)>0 THEN 1108
1107 S2=S2+SGN(H(I+1))*180
1108 IF I=1 THEN PRINT #3," X ",
1109 IF I=3 THEN PRINT #3," Y ",
1110 IF I=5 THEN PRINT #3," Z ",
1111 PRINT #3,TAB(15);F1*H(I);TAB(29);F1*H(I+1);TAB(43);F1*S1;TAB(57);S2
1112 IF S$="Y" THEN PRINT #2,F1*H(I);",";F1*H(I+1);",";F1*S1;",";S2
1113 REM ----- CALCULATION FOR PEAK MAGNETIC FIELD
1114 S1=S1*S1
1115 S2=S2*P0
1116 A1=A1+S1*COS(2*S2)
1117 A3=A3+S1*SIN(2*S2)
1118 A4=A4+S1
1119 NEXT I
1120 REM ----- PEAK FIELD CALCULATION
1121 PK=SQR(A4/2+SQR(A1*A1+A3*A3)/2)
1122 PRINT #3," MAXIMUM OR PEAK FIELD = ";F1*PK;A$
1123 IF (S$="Y" AND N$="E") THEN PRINT #2,F1*PK;",";O2
1124 IF (S$="Y" AND N$="H") THEN PRINT #2,F1*PK;",";O2
1125 IF S$="Y" THEN PRINT #2,XX;",";YY;",";ZZ
1126 NEXT IX
1127 NEXT IY
1128 NEXT IZ
1129 CLOSE #2
1130 RETURN
1131 REM ********** FREQUENCY INPUT **********
1132 REM ----- SET FLAG
1133 PRINT
1134 INPUT "FREQUENCY (MHZ)";F
1135 IF F=0 THEN F=299.8
1136 IF O$>"C" THEN PRINT #3, " ":PRINT #3, "FREQUENCY (MHZ):";F
1137 W=299.8/F
1138 REM -----VIRTUAL DIPOLE LENGTH FOR NEAR FIELD CALCULATION
1139 S0=.001*W
1140 REM ----- 1 / (4 * PI * OMEGA * EPSILON)
1141 M=4.77783352#*W
1142 REM ----- SET SMALL RADIUS MODIFICATION CONDITION
1143 SRM=.0001*W
1144 PRINT #3, " WAVE LENGTH = ";W;" METERS"
1145 REM ----- 2 PI / WAVELENGTH
1146 W=2*P/W
1147 W2=W*W/2
1148 FLG=0
1149 RETURN
1150 REM ********** GEOMETRY INPUT **********
1151 REM ----- WHEN GEOMETRY IS CHANGED, ENVIRONMENT MUST BE CHECKED
1152 GOSUB 1369
1153 PRINT
1154 IF INFILE THEN 1160
1155 INPUT "NO. OF WIRES";NW
1156 IF NW=0 THEN RETURN
1157 IF NW<=MW THEN 1160
1158 PRINT "NUMBER OF WIRES EXCEEDS DIMENSION..."
1159 GOTO 1155
1160 IF O$>"C" THEN PRINT #3," ":PRINT #3,"NO. OF WIRES:";NW
1161 REM ----- INITIALIZE NUMBER OF PULSES TO ZERO
1162 N=0
1163 FOR I=1 TO NW
1164 IF INFILE THEN GOSUB 1557:GOTO 1190
1165 PRINT
1166 PRINT "WIRE NO.";I
1167 INPUT " NO. OF SEGMENTS";S1
1168 IF S1=0 THEN 1153
1169 A$=" END ONE COORDINATES (X,Y,Z)"
1170 PRINT A$;
1171 INPUT X1,Y1,Z1
1172 IF G<0 AND Z1<0 THEN PRINT "Z CANNOT BE NEGATIVE":GOTO 1170
1173 A$=" END TWO COORDINATES (X,Y,Z)"
1174 PRINT A$;
1175 INPUT X2,Y2,Z2
1176 IF G<0 AND Z2<0 THEN PRINT "Z CANNOT BE NEGATIVE":GOTO 1174
1177 IF X1=X2 AND Y1=Y2 AND Z1=Z2 THEN PRINT"ZERO LENGTH WIRE.":GOTO 1166
1178 A$=" RADIUS"
1179 PRINT " "A$;
1180 INPUT A(I)
1181 IF A(I)<=0! THEN 1179
1182 REM ----- DETERMINE CONNECTIONS
1183 IF O$>"C" THEN PRINT #3," ":PRINT #3,"WIRE NO.";I
1184 GOSUB 1299
1185 PRINT "CHANGE WIRE NO. ";I;" (Y/N) ";
1186 INPUT A$
1187 IF A$="Y" THEN 1165
1188 IF A$<>"N" THEN 1185
1189 REM ----- COMPUTE DIRECTION COSINES
1190 X3=X2-X1
1191 Y3=Y2-Y1
1192 Z3=Z2-Z1
1193 D=SQR(X3*X3+Y3*Y3+Z3*Z3)
1194 CA(I)=X3/D
1195 CB(I)=Y3/D
1196 CG(I)=Z3/D
1197 S(I)=D/S1
1198 REM ----- COMPUTE CONNECTIVITY DATA (PULSES N1 TO N)
1199 N1=N+1
1200 N(I,1)=N1
1201 IF (S1=1 AND I1=0) THEN N(I,1)=0
1202 N=N1+S1
1203 IF I1=0 THEN N=N-1
1204 IF I2=0 THEN N=N-1
1205 IF N>MP THEN PRINT "PULSE NUMBER EXCEEDS DIMENSION":CLOSE:GOTO 1155
1206 N(I,2)=N
1207 IF (S1=1 AND I2=0) THEN N(I,2)=0
1208 IF N<N1 THEN 1247
1209 FOR J=N1 TO N
1210 C%(J,1)=I
1211 C%(J,2)=I
1212 W%(J)=I
1213 NEXT J
1214 C%(N1,1)=I1
1215 C%(N,2)=I2
1216 REM ----- COMPUTE COORDINATES OF BREAK POINTS
1217 I1=N1+2*(I-1)
1218 I3=I1
1219 X(I1)=X1
1220 Y(I1)=Y1
1221 Z(I1)=Z1
1222 IF C%(N1,1)=0 THEN 1230
1223 I2=ABS(C%(N1,1))
1224 F3=SGN(C%(N1,1))*S(I2)
1225 X(I1)=X(I1)-F3*CA(I2)
1226 Y(I1)=Y(I1)-F3*CB(I2)
1227 IF C%(N1,1)=-I THEN F3=-F3
1228 Z(I1)=Z(I1)-F3*CG(I2)
1229 I3=I3+1
1230 I6=N+2*I
1231 FOR I4=I1+1 TO I6
1232 J=I4-I3
1233 X(I4)=X1+J*X3/S1
1234 Y(I4)=Y1+J*Y3/S1
1235 Z(I4)=Z1+J*Z3/S1
1236 NEXT I4
1237 IF C%(N,2)=0 THEN 1245
1238 I2=ABS(C%(N,2))
1239 F3=SGN(C%(N,2))*S(I2)
1240 I3=I6-1
1241 X(I6)=X(I3)+F3*CA(I2)
1242 Y(I6)=Y(I3)+F3*CB(I2)
1243 IF I=-C%(N,2) THEN F3=-F3
1244 Z(I6)=Z(I3)+F3*CG(I2)
1245 GOTO 1255
1246 REM ---- SINGLE SEGMEN 0 PULSE CASE
1247 I1=N1+2*(I-1)
1248 X(I1)=X1
1249 Y(I1)=Y1
1250 Z(I1)=Z1
1251 I1=I1+1
1252 X(I1)=X2
1253 Y(I1)=Y2
1254 Z(I1)=Z2
1255 NEXT I
1256 REM ********** GEOMETRY OUTPUT **********
1257 PRINT #3, " "
1258 PRINT #3, " **** ANTENNA GEOMETRY ****"
1259 IF N>0 THEN 1264
1260 PRINT
1261 PRINT "NUMBER OF PULSES IS ZERO....RE-ENTER GEOMETRY"
1262 PRINT
1263 GOTO 1155
1264 K=1
1265 J=0
1266 FOR I=1 TO N
1267 I1=2*W%(I)-1+I
1268 IF K>NW THEN 1279
1269 IF K=J THEN 1279
1270 J=K
1271 PRINT #3," "
1272 PRINT #3,"WIRE NO. ";K;" COORDINATES",,,"CONNECTION PULSE"
1273 PRINT #3,"X","Y","Z","RADIUS","END1 END2 NO."
1274 IF (N(K,1)><0 OR N(K,2)><0) THEN 1279
1275 PRINT #3,"-","-","-"," -"," - - 0"
1276 K=K+1
1277 IF K>NW THEN 1286
1278 GOTO 1270
1279 PRINT #3,X(I1);TAB(15);Y(I1);TAB(29);Z(I1);TAB(43);A(W%(I));TAB(57);
1280 PRINT #3, USING "### ### ##";C%(I,1),C%(I,2),I
1281 IF (I=N(K,2) OR N(K,1)=N(K,2) OR C%(I,2)=0) THEN K=K+1
1282 IF C%(I,1)=0 THEN C%(I,1)=W%(I)
1283 IF C%(I,2)=0 THEN C%(I,2)=W%(I)
1284 IF (K=NW AND N(K,1)=0 AND N(K,2)=0) THEN 1270
1285 IF (I=N AND K<NW) THEN 1270
1286 NEXT I
1287 PRINT
1288 CLOSE 1:IF INFILE THEN INFILE=0:IF O$>"C" THEN 1293
1289 INPUT " CHANGE GEOMETRY (Y/N) ";A$
1290 IF A$="Y" THEN 1153
1291 IF A$<>"N" THEN 1289
1292 REM ----- EXCITATION INPUT
1293 GOSUB 1430
1294 REM ----- LOADS/NETWORKS INPUT
1295 GOSUB 1455
1296 FLG=0
1297 RETURN
1298 REM ********** CONNECTIONS **********
1299 E(I)=X1
1300 L(I)=Y1
1301 M(I)=Z1
1302 E(I+NW)=X2
1303 L(I+NW)=Y2
1304 M(I+NW)=Z2
1305 G%=0
1306 I1=0
1307 I2=0
1308 J1(I)=0
1309 J2(I,1)=-I
1310 J2(I,2)=-I
1311 IF G=1 THEN 1323
1312 REM ----- CHECK FOR GROUND CONNECTION
1313 IF Z1=0 THEN 1315
1314 GOTO 1318
1315 I1=-I
1316 J1(I)=-1
1317 GOTO 1340
1318 IF Z2=0 THEN 1320
1319 GOTO 1323
1320 I2=-I
1321 J1(I)=1
1322 G%=1
1323 IF I=1 THEN 1358
1324 FOR J=1 TO I-1
1325 REM ----- CHECK FOR END1 TO END1
1326 IF (X1=E(J) AND Y1=L(J) AND Z1=M(J)) THEN 1328
1327 GOTO 1333
1328 I1=-J
1329 J2(I,1)=J
1330 IF J2(J,1)=-J THEN J2(J,1)=J
1331 GOTO 1340
1332 REM ----- CHECK FOR END1 TO END2
1333 IF (X1=E(J+NW) AND Y1=L(J+NW) AND Z1=M(J+NW)) THEN 1335
1334 GOTO 1339
1335 I1=J
1336 J2(I,1)=J
1337 IF J2(J,2)=-J THEN J2(J,2)=J
1338 GOTO 1340
1339 NEXT J
1340 IF G%=1 THEN 1358
1341 IF I=1 THEN 1358
1342 FOR J=1 TO I-1
1343 REM ----- CHECK END2 TO END2
1344 IF (X2=E(J+NW) AND Y2=L(J+NW) AND Z2=M(J+NW)) THEN 1346
1345 GOTO 1351
1346 I2=-J
1347 J2(I,2)=J
1348 IF J2(J,2)=-J THEN J2(J,2)=J
1349 GOTO 1358
1350 REM ----- CHECK FOR END2 TO END1
1351 IF (X2=E(J) AND Y2=L(J) AND Z2=M(J)) THEN 1353
1352 GOTO 1357
1353 I2=J
1354 J2(I,2)=J
1355 IF J2(J,1)=-J THEN J2(J,1)=J
1356 GOTO 1358
1357 NEXT J
1358 PRINT #3," COORDINATES"," "," ","END NO. OF"
1359 PRINT #3," X"," Y"," Z","RADIUS CONNECTION SEGMENTS"
1360 PRINT #3,X1;TAB(15);Y1;TAB(29);Z1;TAB(57);I1
1361 PRINT #3,X2;TAB(15);Y2;TAB(29);Z2;TAB(43);A(I);TAB(57);I2;TAB(71);S1
1362 RETURN
1363 REM ********** ENVIROMENT INPUT **********
1364 PRINT
1365 PRINT " **** WARNING ****"
1366 PRINT "REDO GEOMETRY TO ENSURE PROPER GROUND CONNECTION/DISCONNECTION"
1367 PRINT
1368 REM ----- INITIALIZE NUMBER OF RADIAL WIRES TO ZERO
1369 NR=0
1370 REM ----- SET ENVIRONMENT
1371 PRINT #3," "
1372 A$="ENVIRONMENT (+1 FOR FREE SPACE, -1 FOR GROUND PLANE)"
1373 PRINT A$;
1374 INPUT G
1375 IF O$>"C" THEN PRINT #3,A$;": ";G
1376 IF G=1 THEN 1428
1377 IF G<>-1 THEN 1373
1378 REM ----- NUMBER OF MEDIA
1379 A$=" NUMBER OF MEDIA (0 FOR PERFECTLY CONDUCTING GROUND)"
1380 PRINT A$;
1381 INPUT NM
1382 IF NM<=MM THEN 1385
1383 PRINT "NUMBER OF MEDIA EXCEEDS DIMENSION..."
1384 GOTO 1380
1385 IF O$>"C" THEN PRINT #3,A$;": ";NM
1386 REM ----- INITIALIZE BOUNDARY TYPE
1387 TB=1
1388 IF NM=0 THEN 1428
1389 IF NM=1 THEN 1396
1390 REM ----- TYPE OF BOUNDARY
1391 A$=" TYPE OF BOUNDARY (1-LINEAR, 2-CIRCULAR)"
1392 PRINT " ";A$;
1393 INPUT TB
1394 IF O$>"C" THEN PRINT #3,A$;": ";TB
1395 REM ----- BOUNDARY CONDITIONS
1396 FOR I=1 TO NM
1397 PRINT "MEDIA";I
1398 A$=" RELATIVE DIELECTRIC CONSTANT, CONDUCTIVITY"
1399 PRINT " ";A$;
1400 INPUT T(I),V(I)
1401 IF O$>"C" THEN PRINT #3,A$;": ";T(I)","V(I)
1402 IF I>1 THEN 1414
1403 IF TB=1 THEN 1414
1404 A$=" NUMBER OF RADIAL WIRES IN GROUND SCREEN"
1405 PRINT " ";A$;
1406 INPUT NR
1407 IF O$>"C" THEN PRINT #3,A$;": ";NR
1408 IF NR=0 THEN 1414
1409 A$=" RADIUS OF RADIAL WIRES"
1410 PRINT " ";A$;
1411 INPUT RR
1412 IF O$>"C" THEN PRINT #3,A$;": ";RR
1413 REM ----- INITIALIZE COORDINATE OF MEDIA INTERFACE
1414 U(I)=1000000!
1415 REM ----- INITIALIZE HEIGHT OF MEDIA
1416 H(I)=0
1417 IF I=NM THEN 1422
1418 A$=" X OR R COORDINATE OF NEXT MEDIA INTERFACE"
1419 PRINT " ";A$;
1420 INPUT U(I)
1421 IF O$>"C" THEN PRINT #3,A$;": ";U(I)
1422 IF I=1 THEN 1427
1423 A$=" HEIGHT OF MEDIA"
1424 PRINT " ";A$;
1425 INPUT H(I)
1426 IF O$>"C" THEN PRINT #3,A$;": ";H(I)
1427 NEXT I
1428 RETURN
1429 REM ********** EXCITATION INPUT **********
1430 PRINT
1431 A$="NO. OF SOURCES "
1432 PRINT A$;
1433 INPUT NS
1434 IF NS<1 THEN NS=1
1435 IF NS<=MP THEN 1438
1436 PRINT "NO. OF SOURCES EXCEEDS DIMENSION ..."
1437 GOTO 1432
1438 IF O$>"C" THEN PRINT #3," ":PRINT #3, A$;": ";NS
1439 FOR I=1 TO NS
1440 PRINT
1441 PRINT "SOURCE NO. ";I;":"
1442 A$="PULSE NO., VOLTAGE MAGNITUDE, PHASE (DEGREES)"
1443 PRINT A$;
1444 INPUT E(I),VM,VP
1445 IF E(I)<=N THEN 1448
1446 PRINT "PULSE NUMBER EXCEEDS NUMBER OF PULSES..."
1447 GOTO 1443
1448 IF O$>"C" THEN PRINT #3,A$;": ";E(I)","VM","VP
1449 L(I)=VM*COS(VP*P0)
1450 M(I)=VM*SIN(VP*P0)
1451 NEXT I
1452 IF FLG=2 THEN FLG=1
1453 RETURN
1454 REM ********** LOADS INPUT **********
1455 PRINT
1456 INPUT "NUMBER OF LOADS ";NL
1457 IF NL<=ML THEN 1460
1458 PRINT "NUMBER OF LOADS EXCEEDS DIMENSION..."
1459 GOTO 1456
1460 IF O$>"C" THEN PRINT #3,"NUMBER OF LOADS";NL
1461 IF NL<1 THEN 1492
1462 INPUT "S-PARAMETER (S=jw) IMPEDANCE LOAD (Y/N)";L$
1463 IF L$<>"Y" AND L$<>"N" THEN 1462
1464 A$="PULSE NO.,RESISTANCE,REACTANCE"
1465 IF L$="Y" THEN A$= "PULSE NO., ORDER OF S-PARAMETER FUNCTION"
1466 FOR I=1 TO NL
1467 PRINT
1468 PRINT "LOAD NO. ";I;":"
1469 IF L$="Y" THEN 1476
1470 PRINT A$;
1471 INPUT LP(I),LA(1,I,1),LA(2,I,1)
1472 IF LP(I)>N THEN PRINT "PULSE NUMBER EXCEEDS NUMBER OF PULSES...": GOTO 1470
1473 IF O$>"C" THEN PRINT #3,A$;": ";LP(I);",";LA(1,I,1);",";LA(2,I,1)
1474 GOTO 1491
1475 REM ----- S-PARAMETER LOADS
1476 PRINT A$;
1477 INPUT LP(I),LS(I)
1478 IF LP(I)>N THEN PRINT "PULSE NUMBER EXCEEDS NUMBER OF PULSES...": GOTO 1476
1479 IF LS(I)>MA THEN PRINT "MAXIMUM DIMENSION IS 10":GOTO 1477
1480 IF O$>"C" THEN PRINT #3,A$;": ";LP(I);",";LS(I)
1481 FOR J=0 TO LS(I)
1482 A$="NUMERATOR, DENOMINATOR COEFFICIENTS OF S^"
1483 PRINT A$;J;
1484 INPUT LA(1,I,J),LA(2,I,J)
1485 IF O$>"C" THEN PRINT #3,A$;J;":";LA(1,I,J);",";LA(2,I,J)
1486 NEXT J
1487 IF LS(I)>0 THEN 1491
1488 LS(I)=1
1489 LA(1,I,1)=0
1490 LA(2,I,1)=0
1491 NEXT I
1492 FLG=0
1493 RETURN
1494 REM ********** MAIN PROGRAM **********
1495 REM ----- DATA INITIALIZATION
1496 REM ----- PI
1497 P=4*ATN(1)
1498 REM ----- CHANGES DEGREES TO RADIANS
1499 P0=P/180
1500 B$="********************"
1501 REM ----- INTRINSIC IMPEDANCE OF FREE SPACE DIVIDED BY 2 PI
1502 G0=29.979221#
1503 REM ---------- Q-VECTOR FOR GAUSSIAN QUADRATURE
1504 READ Q(1),Q(2),Q(3),Q(4),Q(5),Q(6),Q(7),Q(8),Q(9),Q(10),Q(11),Q(12)
1505 READ Q(13),Q(14)
1506 DATA .288675135,.5,.430568156,.173927423,.169990522,.326072577
1507 DATA .480144928,.050614268,.398333239,.111190517
1508 DATA .262766205,.156853323,.091717321,.181341892
1509 REM ---------- E-VECTOR FOR COEFFICIENTS OF ELLIPTIC INTEGRAL
1510 READ C0,C1,C2,C3,C4,C5,C6,C7,C8,C9
1511 DATA 1.38629436112,.09666344259,.03590092383,.03742563713,.01451196212
1512 DATA .5,.12498593397,.06880248576,.0332835346,.00441787012
1513 REM ----- IDENTIFY OUTPUT DEVICE
1514 GOSUB 1580
1515 PRINT #3,TAB(20);B$;B$
1516 PRINT #3,TAB(22);"MINI-NUMERICAL ELECTROMAGNETICS CODE"
1517 PRINT #3,TAB(36);"MININEC"
1518 PRINT #3,TAB(24);DATE$;TAB(48);TIME$
1519 PRINT #3,TAB(20);B$;B$
1520 REM ----- FREQUENCY INPUT
1521 GOSUB 1133
1522 REM ----- ENVIRONMENT INPUT
1523 GOSUB 1369
1524 REM ----- CHECK FOR NEC-TYPE GEOMETRY INPUT
1525 GOSUB 1550
1526 REM ----- GEOMETRY INPUT
1527 GOSUB 1153
1528 REM ----- MENU
1529 PRINT
1530 PRINT B$;" MININEC MENU ";B$
1531 PRINT " G - CHANGE GEOMETRY C - COMPUTE/DISPLAY CURRENTS"
1532 PRINT " E - CHANGE ENVIRONMENT P - COMPUTE FAR-FIELD PATTERNS"
1533 PRINT " X - CHANGE EXCITATION N - COMPUTE NEAR-FIELDS"
1534 PRINT " L - CHANGE LOADS"
1535 PRINT " F - CHANGE FREQUENCY Q - QUIT"
1536 PRINT B$;B$;B$
1537 INPUT " COMMAND ";C$
1538 IF C$="F" THEN GOSUB 1133
1539 IF C$="P" THEN GOSUB 621
1540 IF C$="X" THEN GOSUB 1430
1541 IF C$="E" THEN GOSUB 1364
1542 IF C$="G" THEN GOSUB 1152
1543 IF C$="C" THEN GOSUB 497
1544 IF C$="L" THEN GOSUB 1455
1545 IF C$="N" THEN GOSUB 875
1546 IF C$<>"Q" THEN 1529
1547 IF O$="P" THEN PRINT #3, CHR$(12) ELSE IF O$="C" THEN PRINT #3, " "
1548 CLOSE
1549 GOTO 1617
1550 REM ********** NEC-TYPE GEOMETRY INPUT **********
1551 OPEN "MININEC.INP" AS #1 LEN=30
1552 FIELD #1,2 AS S$,4 AS X1$,4 AS Y1$,4 AS Z1$,4 AS X2$,4 AS Y2$,4 AS Z2$,4 AS R$
1553 GET 1
1554 NW=CVI(S$)
1555 IF NW THEN INFILE=1
1556 RETURN
1557 REM ---------- GET GEOMETRY DATA FROM MININEC.INP
1558 GET 1
1559 S1=CVI(S$)
1560 X1=CVS(X1$)
1561 Y1=CVS(Y1$)
1562 Z1=CVS(Z1$)
1563 X2=CVS(X2$)
1564 Y2=CVS(Y2$)
1565 Z2=CVS(Z2$)
1566 A(I)=CVS(R$)
1567 IF G<0 THEN IF Z1<0 OR Z2<0 THEN GOSUB 1572
1568 PRINT #3," ":PRINT #3,"WIRE NO.";I
1569 IF X1=X2 AND Y1=Y2 AND Z1=Z2 THEN PRINT"WIRE LENGTH IS ZERO.":GOTO 1547
1570 GOSUB 1299
1571 RETURN
1572 IF IZNEG THEN 1576
1573 PRINT"NEGATIVE Z VALUE ENCOUNTERED FOR GROUND PLANE."
1574 INPUT "ABORT OR CONVERT NEGATIVE Z VALUE TO ZERO (A/C)? ";A$
1575 IF A$="A" THEN 1547 ELSE IF A$="C" THEN IZNEG=1 ELSE 1574
1576 IF Z1<0 THEN Z1=-Z1
1577 IF Z2<0 THEN Z2=-Z2
1578 RETURN
1579 REM ********** IDENTIFY OUTPUT DEVICE **********
1580 INPUT "OUTPUT TO CONSOLE, PRINTER, OR DISK (C/P/D)";O$
1581 IF O$="C" THEN F$="SCRN:":GOTO 1586
1582 IF O$="P" THEN F$="LPT1:":GOTO 1586
1583 IF O$<>"D" THEN 1580
1584 INPUT "FILENAME (NAME.OUT)";F$
1585 IF LEFT$(RIGHT$(F$,4),1)="." THEN 1586 ELSE F$=F$+".OUT"
1586 OPEN F$ FOR OUTPUT AS #3
1587 CLS
1588 RETURN
1589 REM ********** CALCULATE ELAPSED TIME **********
1590 IH=VAL(MID$(T$,1,2))-VAL(MID$(OT$,1,2))
1591 IM=VAL(MID$(T$,4,2))-VAL(MID$(OT$,4,2))
1592 IS=VAL(MID$(T$,7,2))-VAL(MID$(OT$,7,2))
1593 IF IS<0 THEN IS=IS+60:IM=IM-1
1594 IF IM<0 THEN IM=IM+60:IH=IH-1
1595 IF IH<0 THEN IH=IH+24
1596 T$=":"+MID$(STR$(IS+100),3)
1597 IF IH THEN T$=MID$(STR$(IH),2)+":"+MID$(STR$(IM+100),3)+T$ ELSE T$=MID$(STR$(IM),2)+T$
1598 RETURN
1599 REM ********** CALCULATE APPROXIMATE TIME REMAINING **********
1600 IPCT=100*PCT
1601 T$=TIME$
1602 IH=VAL(MID$(T$,1,2))-VAL(MID$(OT$,1,2))
1603 IF IH<0 THEN IH=IH+24
1604 IM=VAL(MID$(T$,4,2))-VAL(MID$(OT$,4,2))
1605 IS=VAL(MID$(T$,7,2))-VAL(MID$(OT$,7,2))
1606 IS=IS+60*(IM+60*IH)
1607 IS=IS*(1/PCT-1)
1608 IM=INT(IS/60)
1609 IS=IS MOD 60
1610 IH=INT(IM/60)
1611 IM=IM MOD 60
1612 T$=":"+MID$(STR$(IS+100),3)
1613 IF IH THEN T$=MID$(STR$(IH),2)+":"+MID$(STR$(IM+100),3)+T$ ELSE T$=MID$(STR$(IM),2)+T$
1614 LOCATE CSRLIN,1
1615 PRINT Q$;IPCT;"% COMPLETE - APPROX TIME REMAINING "T$" ";
1616 RETURN
1617 END
Redoutable
31.08.2019, 15:55
Из тыщи строк надо распараллелить от силы строк 100. Заполнение матрицы и решение системы линейных уравнений. И не обязательно методом Гаусса. Щас для больших матриц существует масса итеративных методов хорошо ложащихся на параллельные вычисления. Например, Метод Гаусса — Зейделя. И давно существуют уже готовые решения и библиотеки. Предлагаю организовать общественный комитет по распараллеливанию. Назначить комиссаров, выдать кожанки и маузеры. А каждого десятого - расстрелять как предателя... И вот что, ребята, пулемет я вам не дам!
Параллелизм сложен в общем случае.
В расчетных программах все намного проще. Если есть неитерационные циклы (например, надо обсчитать каждый сегмент), то параллелизм можно обеспечить просто выполняя циклы по количеству ядер. Накладные расходы на распараллеливание и слияние невелики.
Согласно Максвеллу каждый элементарный участок антенны излучает независимо от других.
Короче, если даже тупо перевести код MMANA на любой язык, поддерживающий параллелизм, то эффект уже будет (в разы быстрее).
Но можно поступить еще проще.
Обсчитывайте антенну сразу в 16 копиях (или сколько у вас там ядер) MMANA с разными параметрами, и ничего с самой программой делать не надо.
Просто сделайте оболочку под себя.
И вот что, ребята, пулемет я вам не дам!
Патронами хотя бы снабдите.
В MMANA обойма на 512 проводов, удвоить бы её обьем до 1024.
Если есть исходный код, то поставить другую размерность массива минутное дело. Но время вычислений будет расти скорее всего пропорционально квадрату размерности.
В коде на BASIC выше ограничение 150 сегментов, так и программа аж 86 года. Я слышал, что тогда процессоры были помедленнее.
Redoutable, для автоматического обновления maa в проекте в ммане можно использовать программу Quick Macros 2, которая будет выполнять клики мышкой при активации окна.
Исходники программы mn3.x64.exe будут?
RA6FOO Бывает нужда в свыше 512 проводов? Можно пример такого проекта?
Redoutable
31.08.2019, 20:25
Redoutable, для автоматического обновления maa в проекте в ммане можно использовать программу Quick Macros 2, которая будет выполнять клики мышкой при активации окна.
Исходники программы mn3.x64.exe будут?
mn3.x64.exe это переделанный приведенный выше код на Бейсике, но без ограничений на число сегментов, нагрузок и источников. Только объем доступной памяти и время ожидания. Исходников не будет. Пока. Может потом, в светлом будущем когда вставлю параллельный код...
RA6FOO Бывает нужда в свыше 512 проводов? Можно пример такого проекта?
Не проводов, а сегментов. В проводе может быть, скажем 100 сегментов. А пример проекта? Я как-то считал антенное поле из 300 вибраторов. К сожалению, приходилось сильно упрощать и разбивать его на 10 тыс. сегментов (33 сегмента на вибратор, @#$%!). Или считать кусками. После 10 тыс. сегментов время расчета становилось просто неприемлемым. Запускал и уходил на обед... До следующего утра, без гарантии правильного ответа. Т.к. на больших матрицах Гаусс начинает выдавать всякие чудеса. Сказываются ошибки округления.
Не проводов, а сегментов.Не сегментов, а проводов.
В оболочке ограничитель - 512 проводов.
Иногда нужно в несколько раз больше.
А сегментов в таком случае достаточно по 2 на провод
Бывает нужда в свыше 512 проводов? Можно пример такого проекта?
Бывает.
Redoutable
31.08.2019, 21:17
2 сегмента на провод? @#$%! офигевший смайлик. Может идеальный диполь подвешенный в вакууме.
В самом диполе-то достаточно сегментов, больше 20и.
А в мелкой, непрозрачной для расчетной частоты, сетке проводов 2 сегмента вполне достаточно.
Файл выше как пример, не лучший, коаксиал экономнее квадратный, а не 8и угольный.
Да и соответствие волнового проще у него контролировать.
Здесь уже длина коаксиала 0.5, а не 0.25 лямбда, сетку бы поплотнее раза в полтора - два,
но проводов уже лимит, почти 500
Redoutable
31.08.2019, 22:26
Откройте "базуку" в mn3see.exe и делайте сколько угодно проводов. Там нет таких ограничений.
0.5+стакан.maa (29.7 Кб, Просмотров: 3
ОФФ
Вы хотели убедиться в работоспособности четвертьволнового стакана? Упростил Вашу модель до 5-ти проводов - картина практически та же. Можно сделать 9 проводов и будет почти точно. Или Вам существенна разница волнового сопротивления в +/- 0,2 Ома, и длина в +/- 0,5 мм?
Откройте "базуку" в mn3see.exe
У меня Виндовс ХР.
Вы хотели убедиться в работоспособности четвертьволнового стакана?
Нет, просто использовал заготовку коаксиала.
Подрисовал к ней три провода, и всё.
А то, что вы сделали, не коаксиальный стакан,
а 0,25 шлейф, один или несколько параллельно.
Обсчитывайте антенну сразу в 16 копиях
Хотя бы на разных частотах, чтобы графики быстрее строились.
Ядро NEC2 уже давно переписано на язык Си с использованием многопоточности. Только другими авторами
У меня такие ядра есть ( несколько разных, под разные размеры массивов выделяемой памяти).
Какая разница, какой моделировщик использовать?
NEC2 очень капризный. В плане стыковки проводов с разными диаметрами, к примеру.
Двухпроводную линию ( если её рисовать, а не задавать при помощи TL) с W меньше 500 Ом считает с ужасной погрешностью - в разы меняется ( из-за погрешности) расчётное входное сопротивление при W=200 примерно.
Ещё у ММАНы очень удобный интерфейс. К которому привыкал годами ...
Возможности NEC2, конечно, не идут в сравнение с MN , если бы не "капризы" ...
Бывает.
Очень даже бывает.
Сколько не пытался возбуждаемую "объёмной гаммой" ферму заменить проводом с якобы эквивалентным диаметром, расчёты сильно отличаются от практики.
Просто GP из мачты - вопрос решённый . Ничего моделировать толком ( уже) не надо. Надо брать, делать, измерять и согласовывать. Таких уж с десяток сделали в разных городах и весях.
Но ! Из-за этой проблемы на несколько лет ( уже как) зависли очень интересные версии переключалок, которые можно развесить на мачте ( на которой уже что-то вращается на верхние диапазоны ). :s9:
использовал заготовку коаксиала.
Коаксиал в чистом виде не получится.
На смоделированной проводами оплётке невозможно выделить поверхности внутреннего и внешнего скин-слоёв.
В лучшем случае мелкой сеткой можно смоделировать условно отражающую поверхность - экран на дверце микроволновки.
NEC2 очень капризный. В плане стыковки проводов с разными диаметрами, к примеру.
Двухпроводную линию ( если её рисовать, а не задавать при помощи TL) с W меньше 500 Ом считает с ужасной погрешностью - в разы меняется ( из-за погрешности) расчётное входное сопротивление при W=200 примерно.
ОФФ
Да. Но я считаю, что это даже хорошо. Так как моделируя в NEC2 мы сразу видим проблемные места в нашей модели. Соответственно их можно учитывать и избегать. А в MMANA в этом плане "всё хорошо". Она сама автоматически пытается избежать проблем. При этом она, как Вы сами уже писали "тупо врёт, даже не подмигивая" :)
Так как моделируя в NEC2 мы сразу видим проблемные места в нашей модели.
Не считаю ни разу проблемными местами подключение тонких ( D=1 мм) проводов к толстым ( D=45 мм ) трубам. Противовесы к GP, например, или проволочные добавки к элементам антенны Яги.
В MN можно сделать короткий переход с D=7. А сколько таких переходов делать в NEC2?
Во сколько раз вырастет время обсчёта, если заменить толстую трубу цилиндром из тонких проводов? Риторический вопрос, конечно.
ОФФ
Если верить описанию википедии (http://en.wikipedia.org/wiki/Numerical_Electromagnetics_Code#MININEC), то да, mininec лучше справляется с переходами диаметров и углами. Если Вам именно это важно, то конечно же используйте mininec. Каждой задаче своё ядро.
Так как моделируя в NEC2 мы сразу видим проблемные места в нашей модели.
Ага, видно очень наглядно, что половина мощности усиления в результатах расчета куда то пропала
Не считаю ни разу проблемными местами ... или проволочные добавки к элементам антенны Яги.
В них самых и "пропадает".
И если бы только этим страдал NEC ....
!0 лет назад я уже говорил об этом http://ra6foo.qrz.ru/necman.html
Коаксиал в чистом виде не получится.
На смоделированной проводами оплётке невозможно выделить поверхности внутреннего и внешнего скин-слоёв.
В лучшем случае мелкой сеткой можно смоделировать условно отражающую поверхность - экран на дверце микроволновки.
1 - В чистом виде он и в реале не существует.
2 - Всего лишь то, что как и на любом проводе, токи по внутренней и внешней поверхности сетки алгебраически суммируются.
3 - У сетки микроволновки ячейки 1/100 лямбда, в моих моделях в 1.5 раза плотнее. Этого достаточно для экранирования
Во всех программах, FEKO, HFSS и т. п., в модели поверхности не сплошные, а сетка проводов.
В этом вопросе дискутировать можно только цифрами.
В этом вопросе дискутировать можно только цифрами.
Сколько угодно работайте с цифрами.
Построить и просчитать оплётку коаксиала в программе MMANA не удастся. Это просто надо понимать.
Всё уже просчитано, Александр, и волновое и экранирование коаксиала и многое другое.
И не только с коаксиалом, и сеткой и экранами и т. п. просчитано и проананизировано.
Эта работа сводит на нет значение для меня чьих либо мнений и понятий в этом вопросе,
в том числе и ваше или транслируемое вами без его понимания.
просчитано и проананизировано.
Не смею не поверить. Дальнейших вам успехов в любимом деле.
Дело мастера боится - так в народе говорится.
В этом вопросе дискутировать можно только цифрами.
Спасибо, я в курсе вашего энтузиазма - Век живи - век учись... (http://dl2kq.de/forum/index.php/topic,158.msg4446.html#msg4446)
Redoutable
11.09.2019, 00:12
Вопщем, нашел я в инете программу решающую систему линейных уравнений на видеокарте с использованием всяких там параллельных прибамбасов . Провел сравнительные испытания. Картинка получилась такая:
239666
CPU - обычный процессор Intel(R) Core(TM) i7-8700 3.2 GHz, RAM - 32 GB.
GPU - видеокарта GeForce GTX 1060 6GB.
По оси X - размер матрицы
По оси Y - число секунд для решения.
Вывод: До 3000-4000 обычный CPU слабенько, но лидирует. Но после 4000 GPU уверенно уделывает CPU в разы.
P.S. Арифметика, правда обычная. С комплексными числами, думаю результат у CPU будет медленнее раза в 2.
Redoutable
12.09.2019, 16:03
Провел те же испытания с комплексными числами на ноутбуке и десктопнике.
239718
На ноутбуке оказалась дохлая видеокарта (5 SM - потоковых мультипроцессоров, 384 шейдера). Выигрыш по сравнению с его же CPU невелик. Но на сравнительно продвинутой видеокарте на десктопнике (10 SM - потоковых мультипроцессоров, 1280 шейдеров) разница ощутимая.
А если создать распределённые вычисления а-ля BOINC (http://ru.wikipedia.org/wiki/BOINC), то будет ещё быстрее.
Powered by QRZ.RU