Этот пример показов, как создать вложенную многодоменную геометрию, состоящую из сферы единичного радиуса и куба. Первая часть примера создает кубик со сферической полостью при помощи alphaShape
. Вторая часть создает твердую сферу с помощью тетраэдральных элементов, а затем объединяет все тетраэдрические элементы, чтобы получить твердую сферу, встроенную в кубик.
Сначала создайте геометрию, состоящую из куба со сферической полостью. Эта геометрия имеет одну камеру.
Создайте 3-D сетку прямоугольной формы.
[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);
Создайте модель УЧП.
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];
Создайте геометрию двух ячеек из mesh.
[g,msh] = geometryFromMesh(model,combinedNodes,combinedElements,e2c); figure pdegplot(model,'FaceAlpha',0.5,'CellLabels','on') title('Solid Sphere in Cube')