В этом примере показано, как решить уравнение Пуассона с помощью предварительно обработанного итерационного решателя и распределенных массивов. Используя распределенные массивы, можно масштабировать вычисления, используя память кластера машин, а не только память одной машины. Можно масштабировать без изменения кода.
В этом примере рассматриваются темы «Использование распределенных массивов для решения систем линейных уравнений итеративными методами». На основании [1] пример моделирует распределение тепла в комнате с использованием уравнения Пуассона в форме, известной как однородное установившееся тепловое уравнение. Устойчивое состояние означает, что тепло не изменяется со временем, и однородное означает, что нет внешнего источника тепла.
) = 0
В уравнении представляет температуру в каждой точке z) помещения. Для решения уравнения сначала его аппроксимируют системой линейных уравнений с помощью метода дискретизации конечных разностей. Затем используются предварительно подготовленные сопряженные градиенты (pcg) способ решения системы. Предварительное кондиционирование преобразует проблему, чтобы улучшить производительность числового решателя. Используя распределенные массивы, можно использовать объединенную память кластера машин и обеспечить более точные дискретизации.
Узнайте, как:
Настройте дискретную сетку 3-D и граничные условия.
Определите дискретизацию и мультигридное предварительное условие.
Примените числовой решатель с предварительным условием для решения уравнения теплоты по 3-D объему.
В этом примере куб стороны 1 моделирует комнату. Первым шагом является дискретизация с использованием 3-D сетки.
Метод предварительной подготовки в этом примере использует несколько сеток с различными уровнями гранулярности. Каждый уровень укрупняет сетку на коэффициент 2 в каждом измерении. Определите количество многопользовательских уровней.
multigridLevels = 2;
Определите количество точек в каждом размере, X, Y, и Z, из лучшей сетки. Метод предварительной подготовки требует, чтобы количество точек в этой сетке делилось на 2^multigridLevels. В этом случае количество точек должно быть разделено на 4, так как количество мультигридных уровней равно 2.
numPoints.X = 32; numPoints.Y = 32; numPoints.Z = 32;
Дискретизируйте пространственные размеры с помощью 3-D сетки с помощью meshgrid функция. Равномерно делите каждый размер в соответствии с количеством точек с помощью linspace. Обратите внимание, что для включения границ куба необходимо добавить две дополнительные точки.
[X,Y,Z] = meshgrid(linspace(0,1,numPoints.X+2), ... linspace(0,1,numPoints.Y+2), ... linspace(0,1,numPoints.Z+2));
Предположим, в комнате есть окно и дверь. Стены и потолок имеют постоянную температуру 0 градусов, окно - постоянную температуру 16 градусов, а дверь - постоянную температуру 15 градусов. Пол под 0,5 градуса. Цель состоит в том, чтобы определить распределение температуры внутри помещения.
Определите координаты пола, окна и двери с помощью операторов отношения и задайте температуру для этих граничных элементов. Границы являются гранями куба и, следовательно, одной из X,Y, или Z должно быть 0 или 1. Задайте для остальной границы и внутренней части куба значение 0.
floor = (0.0 <= X & X <= 1.0) & (0.0 <= Y & Y <= 1) & (Z == 0.0); window = (X == 1) & (0.2 <= Y & Y <= 0.8) & (0.4 <= Z & Z <= 0.6); door = (0.4 <= X & X <= 0.6) & (Y == 1.0) & (0.0 <= Z & Z <= 0.6); u = zeros(size(X)); u(floor) = 0.5; u(window) = 16; u(door) = 15;
Эти граничные условия определяют постоянные значения, которые решение должно принимать вдоль границы области. Этот тип граничного условия называется граничным условием Дирихле.
Визуализация граничных условий с помощью slice функция. Используйте фрагменты, расположенные на границе куба, которые показывают ненулевые граничные условия.
xSlices = 1; ySlices = 1; zSlices = 0; f = slice(X,Y,Z,u,xSlices,ySlices,zSlices,'nearest'); title('Constant nonzero boundary conditions'), xlabel('x'), ylabel('y'), zlabel('z'); colorbar, colormap cool; shading interp; set(f,'EdgeColor',[0 0 0]);

В этом примере дифференциальное уравнение дискретизируется в линейную систему с использованием метода аппроксимации конечных разностей и для улучшения производительности итерационного решателя используется мультигридное предварительное условие. Для этого примера используйте дискретизацию и предварительное условие в вспомогательных функциях. discretizePoissonEquation и multigridPreconditioner. Для других проблем выберите дискретизацию и предварительное условие, соответствующие вашему приложению.
В этом примере: discretizePoissonEquation дискретизирует уравнение Пуассона с помощью метода конечных разностей из семи точек и шаблона в несколько сеток с различными уровнями гранулярности. Функция создает мультигридную структуру дискретизации с предварительно вычисленными треугольными факторизациями и операторами, которые отображают между грубым и тонким уровнями. Средство предварительного кондиционирования использует эту информацию из нескольких гридов для эффективного аппроксимирования решения.
Среди других методов этот модуль предварительного кондиционирования применяет сглаживание для минимизации ошибок с помощью ряда приближений. Определите количество шагов сглаживания. Использование большего числа шагов делает аппроксимации более точными, но и более вычислительными. Затем дискретизируйте дифференциальное уравнение и установите предварительное условие.
numberOfSmootherSteps = 1; [A,b,multigridData] = discretizePoissonEquation(numPoints,multigridLevels,numberOfSmootherSteps,u);
Level 0: The problem is of dimension 32768 with 223232 nonzeros. Level 1: The problem is of dimension 4096 with 27136 nonzeros. Level 2: The problem is of dimension 512 with 3200 nonzeros.
preconditioner = setupPreconditioner(multigridData);
Решите линейную систему с помощью предварительно кондиционированных сопряженных градиентов.
tol = 1e-12; maxit = numel(A); pcg(A,b,tol,maxit,preconditioner);
pcg converged at iteration 45 to a solution with relative residual 5.4e-13.
Если требуется больше вычислительных ресурсов, таких как память, можно масштабировать с помощью распределенных массивов без необходимости изменения кода. Распределенные массивы распределяют данные между несколькими работниками, и они могут использовать вычислительную производительность и память кластера машин.
Запустите пул параллельных работников. По умолчанию parpool использует кластер по умолчанию. Проверьте профиль кластера по умолчанию на вкладке Главная страница MATLAB (MATLAB Home) в области Среда (Environment) в разделе Параллельный (Parallel) > Выбрать кластер по умолчанию (Select a Default Cluster).
parpool;
Starting parallel pool (parpool) using the 'MyCluster' profile ... Connected to the parallel pool (number of workers: 12).
Распределите переменную температуры u по памяти работников в кластере с помощью distributed функция.
distU = distributed(u);
Можно использовать тот же код, что и ранее; никаких изменений не требуется, поскольку функции дискретизации и предварительного условия создают распределенные массивы, если вход является распределенным массивом. Многие функции MATLAB расширены для распределенных массивов, поэтому с ними можно работать так же, как с массивами в памяти.
Обратите внимание, что discretizePoissonEquation возвращает структуру, содержащую распределенные данные. Для использования распределенных данных внутри структуры распределенным способом необходимо создать структуру внутри spmd блок. Необходимо также вызвать любую функцию, использующую ее внутри spmd блок.
spmd [A,b,multigridData] = discretizePoissonEquation(numPoints,multigridLevels,numberOfSmootherSteps,distU); preconditioner = setupPreconditioner(multigridData); end
Analyzing and transferring files to the workers ...done. Lab 1: Level 0: The problem is of dimension 32768 with 223232 nonzeros. Level 1: The problem is of dimension 4096 with 27136 nonzeros. Level 2: The problem is of dimension 512 with 3200 nonzeros.
Использовать pcg внутри spmd блок для решения линейной системы распределенным образом.
spmd x = pcg(A,b,tol,maxit,preconditioner); end
Lab 1: pcg converged at iteration 45 to a solution with relative residual 5.4e-13.
Решение из решателя - это вектор, который вписывается в память. Отправка данных от работников клиенту с помощью gather. Переформатируйте данные обратно в 3-D массив и измените порядок размеров, чтобы создать окончательное решение. Задать внутреннюю часть u к этому решению. Внешняя часть, граница, уже содержит значение граничных условий.
x3D = reshape(gather(x),numPoints.X,numPoints.Y,numPoints.Z); u(2:end-1,2:end-1,2:end-1) = permute(x3D, [2, 1, 3]);
Визуализация решения с помощью slice функция. Добавьте дополнительные фрагменты для построения графика температуры внутри куба. Вы можете использовать Rotate или изменить положение фрагментов, чтобы исследовать решение.
xSlices = [.5,1]; ySlices = [.5,1]; zSlices = [0,.5]; f = slice(X,Y,Z,u,xSlices,ySlices,zSlices,'nearest'); title('Heat distribution'), xlabel('x'), ylabel('y'), zlabel('z'); colorbar, colormap cool; shading interp;

Вы можете попробовать различные значения numPoints в этом примере для проверки различных уровней дискретизации. Использование большего значения увеличивает разрешение, но требует больше памяти. Кроме того, чем больше multigridLevels то есть чем эффективнее память, тем выше предусловие. Однако более крупный multigridLevels подразумевает менее точное предварительное кондиционирование, так как укрупнение снижает точность на каждом уровне. В результате решателю может потребоваться больше итераций для достижения такого же уровня точности.
Определите мультигридное предварительное кондиционирующее устройство для использования с методом предварительно кондиционированных сопряженных градиентов. Этот тип предварительного кондиционирования использует несколько дискретизационных сеток с различными уровнями гранулярности, чтобы более эффективно аппроксимировать решение системы линейных уравнений. Способ предварительной подготовки в этом примере основан на [2] и следует следующим основным этапам:
Пресмут с использованием метода приближения Гаусса - Зайделя.
Вычислите остаточное решение на более грубом уровне.
Рекурсивное предварительное условие на более грубом уровне или решение непосредственно на самом грубом уровне.
Обновите решение с помощью решения с более грубой сеткой.
Постсмут с использованием метода аппроксимации Гаусса - Зайделя.
function x = multigridPreconditioner(mgData,r,level) if(level < mgData(level).MaxLevel) x = zeros(size(r),'like',r); % Presmooth using Gauss-Seidel for i=1:mgData(level).NumberOfSmootherSteps x = mgData(level).Matrices.LD \ (-mgData(level).Matrices.U*x + r); x = mgData(level).Matrices.DU \ (-mgData(level).Matrices.L*x + r); end % Compute residual on a coarser level Axf = mgData(level).Matrices.A*x; rc = r(mgData(level).Fine2CoarseOperator)- Axf(mgData(level).Fine2CoarseOperator); % Recursive call until coarsest level is reached xc = multigridPreconditioner(mgData, rc, level+1); % Update solution with prolonged coarse grid solution x(mgData(level).Fine2CoarseOperator) = x(mgData(level).Fine2CoarseOperator)+xc; % Postsmooth using Gauss-Seidel for i = 1:mgData(level).NumberOfSmootherSteps x = mgData(level).Matrices.LD \ (-mgData(level).Matrices.U*x + r); x = mgData(level).Matrices.DU \ (-mgData(level).Matrices.L*x + r); end else % Obtain exact solution on the coarsest level x = mgData(level).Matrices.A \ r; end end
Создайте функцию, которая принимает данные multigrid и возвращает дескриптор функции, который применяет средство предварительного кондиционирования к входным данным. В этом примере этот дескриптор функции является вводом предварительного условия в pcg. Необходимо создать эту функцию, поскольку невозможно определить анонимные функции внутри spmd блоки.
function preconditioner = setupPreconditioner(multigridData) if ~isempty(multigridData) preconditioner = @(x,varargin) multigridPreconditioner(multigridData,x,1); else preconditioner = []; end end
[1] Донгарра, Дж., М. А. Геру и П. Лушек. «Эталонный тест HPCG: новая метрика для ранжирования высокопроизводительных вычислительных систем». Ноксвилл, TN: Университет Теннесси, 2015.
[2] Элман, Х. К., Д. Дж. Сильвестр и А. Дж. Ватен. Конечные элементы и быстрые итерационные решатели: с приложениями в несжимаемой динамике жидкости. Оксфорд, Великобритания: Oxford University Press, 2005, раздел 2.5.
distributed | gather | pcg | spmd