exponenta event banner

Параллелизация анализа антенн и решеток

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

В этом примере требуется следующий продукт:

  • Панель инструментов для параллельных вычислений

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

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

Расчет осевого отношения без параллельных вычислений

Вычислите осевое отношение архимедовой спирали по полосе частот от 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;

Сравнение времени вычисления осевого отношения

В таблице ниже показано время, затрачиваемое на анализ осевого отношения с панелью параллельных вычислений и без нее. Сведения о кластере сохраняются в переменных 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');

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

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

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

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

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

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

Если мы будем использовать parfor петлю, передавая одну частоту за один раз (как показано в дискуссии о axialRatio), то запутывающее произойдет на каждой частоте. Это ограничит преимущества параллельных вычислений. Лучший вариант - вручную создать сетку структуры, а затем использовать цикл parfor для выполнения сдвига частоты. Простой способ сделать это - сначала выполнить анализ на самой высокой частоте и получить информацию о сетке с помощью 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);

См. также

|