В этом примере показано, как разделить одно-доменную геометрию блока в две области. Первая часть примера генерирует mesh и делит элементы mesh на две группы. Вторая часть примера создает 2D доменную геометрию на основе этого деления.
Создайте модель PDE.
modelSingleDomain = createpde;
Импортируйте геометрию.
importGeometry(modelSingleDomain,'Block.stl');
Сгенерируйте и постройте mesh.
msh = generateMesh(modelSingleDomain); figure pdemesh(modelSingleDomain)
Получите узлы и элементы mesh.
nodes = msh.Nodes; elements = msh.Elements;
Найдите x-координаты геометрических центров всех элементов mesh. Во-первых, создайте массив одного размера с elements
это содержит x-координаты узлов, формирующих элементы mesh. Каждый столбец этого вектора содержит x-координаты 10 узлов, которые формируют элемент.
elemXCoords = reshape(nodes(1,elements),10,[]);
Вычислите среднее значение каждого столбца этого массива, чтобы получить вектор из x-координат элемента геометрические центры.
elemXCoordsGeometricCenter = mean(elemXCoords);
Примите, что все элементы имеют тот же ID области и создают матричный 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)
Подсветите элементы от ячейки 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')