Многодоменная геометрия, восстановленная из Mesh

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

Сгенерируйте Mesh и разделите ее элементы на две группы

Создайте модель УЧП.

modelSingleDomain = createpde;

Импортируйте геометрию.

importGeometry(modelSingleDomain,'Block.stl');

Сгенерируйте и постройте mesh.

msh = generateMesh(modelSingleDomain);

figure
pdemesh(modelSingleDomain)

Получите узлы и элементы mesh.

nodes = msh.Nodes;
elements = msh.Elements;

Найдите координаты X геометрических центров всех элементов mesh. Во-первых, создайте массив того же размера, что и elements который содержит координаты X узлов, образующих элементы сетки. Каждый столбец этого вектора содержит x-координаты 10 узлов, которые образуют элемент.

elemXCoords = reshape(nodes(1,elements),10,[]);

Вычислите среднее значение каждого столбца этого массива, чтобы получить вектор координат X геометрических центров элемента.

elemXCoordsGeometricCenter = mean(elemXCoords);

Предположим, что все элементы имеют одинаковый идентификатор области, и создадим матрицу ElementIdToRegionId.

ElementIdToRegionId = ones(1,size(elements,2));

Найдите идентификаторы всех элементов, для которых x-координата геометрического центра превышает 30.

idx = mean(elemXCoords) > 30;

Для элементов с центрами, расположенными выше x = 30, измените идентификаторы областей на 2.

ElementIdToRegionId(idx) = 2;

Создание геометрии с двумя камерами

Создайте новую модель PDE.

modelTwoDomain = createpde;

Использование geometryFromMesh, импортируйте mesh. Назначьте элементы двум камерам на основе их идентификаторов.

geometryFromMesh(modelTwoDomain,nodes,elements,ElementIdToRegionId)
ans = 
  DiscreteGeometry with properties:

       NumCells: 2
       NumFaces: 108
       NumEdges: 205
    NumVertices: 100
       Vertices: [100x3 double]

Постройте график геометрии, отобразив метки камер.

pdegplot(modelTwoDomain,'CellLabels','on','FaceAlpha',0.5)

Figure contains an axes. The axes contains 3 objects of type quiver, patch, line.

Выделите элементы из камеры 1 красным цветом и элементы из камеры 2 зеленым цветом.

elementIDsCell1 = findElements(modelTwoDomain.Mesh,'region','Cell',1);
elementIDsCell2 = findElements(modelTwoDomain.Mesh,'region','Cell',2);

figure
pdemesh(modelTwoDomain.Mesh.Nodes, ...
        modelTwoDomain.Mesh.Elements(:,elementIDsCell1), ...
        'FaceColor','red')
hold on
pdemesh(modelTwoDomain.Mesh.Nodes, ...
        modelTwoDomain.Mesh.Elements(:,elementIDsCell2), ...
        'FaceColor','green')