Параллелизация анализа антенны и массива

Этот пример показывает, как ускорить анализ антенны и массива с помощью Parallel Computing Toolbox™.

Этот пример требует следующего продукта:

  • Parallel Computing Toolbox

Анализ свипа частоты

Анализ эффективности антенны в полосе частот является важной частью проекта антенны. Анализы портов включают импеданс, returnLoss, спараметры, vswr; поверхностные анализы включают ток и заряд; и полевой анализ включают шаблон, EHfields, axialRatio и beamwidth. В этом примере мы демонстрируем преимущества параллельных вычислений для вычисления коэффициента эллиптичности и обратных потерь в полосе частот.

Коэффициент эллиптичности Расчета без параллельных вычислений

Вычислите коэффициент эллиптичности спирали Архимеда на частотной полосе от 0,8 до 2,5 ГГц в шагах 100 МГц. Это вычисление выполняется последовательно, и время, необходимое для выполнения этих расчетов, сохраняется в переменном времени 1.

sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3);
freq = 0.8e9:100e6:2.5e9;
AR = zeros(size(freq));
tic
for m = 1:numel(freq)
    AR(m) = axialRatio(sp, freq(m), 0, 90);
end
time1 = toc;

Коэффициент эллиптичности Расчета с параллельными вычислениями

Повторите вычисления с помощью Parallel Computing Toolbox, чтобы уменьшить время расчетов. Используйте функцию parpool для создания кластера параллельного пула. Затем используйте parfor, чтобы вычислить коэффициент эллиптичности в той же полосе частот. Время, необходимое для выполнения расчетов, сохраняется в переменном времени 2.

pardata = parpool;
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3);
ARparfor = zeros(size(freq));
tic;
parfor m = 1:numel(freq)
    ARparfor(m) = axialRatio(sp, freq(m), 0, 90);
end
time2 = toc;

Сравнение времени расчета коэффициента эллиптичности

В таблице ниже показано время, необходимое для анализа коэффициента эллиптичности с Parallel Computing Toolbox и без него. Информация о кластере сохранена в переменной pardata.

cases = {'Without Parallel Computing';'With Parallel Computing'};
time  = [time1; time2];
numWorkers = [1; pardata.NumWorkers];
disp(table(time,numWorkers,'RowNames', cases))
                                   time     numWorkers
                                  ______    __________

    Without Parallel Computing    46.155        1     
    With Parallel Computing       18.382        6     
fprintf('Speed-up due to parallel computing = %g', time1/time2)
Speed-up due to parallel computing = 2.5109

Рисунок ниже показывает данные осевого отношения, рассчитанные для двух случаев. Результаты идентичны.

plot(freq./1e9, AR,'r+', freq./1e9, ARparfor,'bo');
grid on;
xlabel('Frequency (GHz)');
ylabel('Axial ratio (dB)');
title('Axial ratio of Archimedean spiral antenna at boresight');
legend('Without Parallel Computing','With Parallel Computing',          ...
    'location', 'Best');

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

Возврат расчетов потерь без параллельных вычислений

В предыдущем разделе выполнены расчеты полевого анализа. Все расчеты анализа поля и поверхности в Antenna Toolbox™ принять только скалярную частоту как вход. Тогда как returnLoss и все другие функции анализа портов принимают вектор частоты как вход.

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

sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3);
tic;
RL = returnLoss(sp, freq);
time3 = toc;

Обратные расчеты потерь с параллельными вычислениями

Если мы используем цикл parfor путем передачи одной частоты за раз (как показано на обсуждении axialRatio), зацепление будет происходить на каждой частоте. Это ограничит преимущество параллельных вычислений. Лучшая опция состоит в том, чтобы вручную создать сетку структуры, а затем использовать цикл parfor, чтобы запустить сдвиг частоты. Простой способ сделать это - сначала запустить анализ на самой высокой частоте и получить информацию о сетке с помощью mesh функция. Используйте максимальную длину ребра в mesh функция для обеспечения того, чтобы одна и та же сетка mesh использовалась для всех расчетов. Время, необходимое для выполнения расчетов, сохраняется в переменном времене4.

sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3);
RLparfor = zeros(size(freq));
tic;
temp = returnLoss(sp, freq(end));
meshdata = mesh(sp);
[~] = mesh(sp, 'MaxEdgeLength', meshdata.MaxEdgeLength);
parfor m = 1:numel(freq)
    RLparfor(m) = returnLoss(sp, freq(m)); 
end
time4 = toc;

Сравнение времени расчета возвратных потерь

В таблице ниже указано время, затраченное на вычисление потерь при возврате с Parallel Computing Toolbox и без него. Информация о кластере сохранена в переменной pardata.

cases = {'Without Parallel Computing';'With Parallel Computing'};
time  = [time3; time4];
numWorkers = [1; pardata.NumWorkers];
disp(table(time,numWorkers,'RowNames', cases))
                                   time     numWorkers
                                  ______    __________

    Without Parallel Computing    5.5858        1     
    With Parallel Computing       3.3974        6     
fprintf('Speed-up due to parallel computing = %g', time3/time4);
Speed-up due to parallel computing = 1.64412

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

plot(freq./1e9, RL,'r+', freq./1e9, RLparfor,'bo');
grid on;
xlabel('Frequency (GHz)');
ylabel('Return loss (dB)');
title('Return loss of Archimedean spiral antenna');
legend('Without Parallel Computing','With Parallel Computing',          ...
    'location', 'Best');

Удалите текущий параллельный пул.

delete(gcp);

См. также

|