Сфера в кубе

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

Куб со сферической полостью

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

Создайте 3-D прямоугольную сетку mesh.

[xg, yg, zg] = meshgrid(-2:0.25:2);
Pcube = [xg(:) yg(:), zg(:)];

Извлеките узлы решетки, расположенные за пределами модуля сферическая область.

Pcavitycube = Pcube(vecnorm(Pcube') > 1,:);

Точки формирования данных на сфере единичного радиуса.

[x1,y1,z1] = sphere(24);
Psphere = [x1(:) y1(:) z1(:)];
Psphere = unique(Psphere,'rows');

Объедините координаты прямоугольной сетки (без точек в сфере) и поверхностные координаты сферы единичного радиуса.

Pcombined = [Pcavitycube;Psphere];

Создайте alphaShape объект, представляющий куб со сферической полостью.

shpCubeWithSphericalCavity = alphaShape(Pcombined(:,1), ...
                                        Pcombined(:,2), ...
                                        Pcombined(:,3));

figure
plot(shpCubeWithSphericalCavity,'FaceAlpha',0.4)
title('alphaShape: Cube with Spherical Cavity')

Восстановите триангуляцию, которая задает область alphaShape объект.

[tri,loc] = alphaTriangulation(shpCubeWithSphericalCavity);

Создайте модель PDE.

modelCube = createpde;

Создайте геометрию из mesh и импортируйте геометрию и mesh в модель.

[gCube,mshCube] = geometryFromMesh(modelCube,loc',tri');

Постройте получившуюся геометрию.

figure
pdegplot(modelCube,'FaceAlpha',0.5,'CellLabels','on')
title('PDEModel: Cube with Spherical Cavity')

Твердая сфера, вложенная в кубе

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

sphereFacets = boundaryFacets(mshCube,'Face',3);
sphereNodes = findNodes(mshCube,'region','Face',3);

Добавьте новый узел в центре.

newNodeID = size(mshCube.Nodes,2) + 1;

Создайте четырехгранные элементы при помощи каждого из этих трех узлов на сферических граничных фасетах и нового узла в начале координат.

sphereTets =  [sphereFacets; newNodeID*ones(1,size(sphereFacets,2))];

Создайте модель, которая комбинирует куб со сферической полостью и сферой.

model = createpde;

Создайте вектор, который сопоставляет весь mshCube элементы к ячейке 1 и все элементы твердой сферы к ячейке 2.

e2c = [ones(1,size(mshCube.Elements,2)), 2*ones(1,size(sphereTets,2))];

Добавьте новый узел в центре [0;0;0] к узлам куба с полостью.

combinedNodes = [mshCube.Nodes,[0;0;0]];

Объедините матрицы возможности соединения элемента.

combinedElements = [mshCube.Elements,sphereTets];

Создайте геометрию 2D ячейки из mesh.

[g,msh] = geometryFromMesh(model,combinedNodes,combinedElements,e2c);
 
figure
pdegplot(model,'FaceAlpha',0.5,'CellLabels','on')
title('Solid Sphere in Cube')