This example shows how to create a nested multidomain geometry consisting of a unit sphere and a cube. The first part of the example creates a cube with a spherical cavity by using alphaShape
. The second part creates a solid sphere using tetrahedral elements, and then combines all tetrahedral elements to obtain a solid sphere embedded in a cube.
First, create a geometry consisting of a cube with a spherical cavity. This geometry has one cell.
Create a 3-D rectangular mesh grid.
[xg, yg, zg] = meshgrid(-2:0.25:2); Pcube = [xg(:) yg(:), zg(:)];
Extract the grid points located outside of the unit spherical region.
Pcavitycube = Pcube(vecnorm(Pcube') > 1,:);
Create points on the unit sphere.
[x1,y1,z1] = sphere(24);
Psphere = [x1(:) y1(:) z1(:)];
Psphere = unique(Psphere,'rows');
Combine the coordinates of the rectangular grid (without the points inside the sphere) and the surface coordinates of the unit sphere.
Pcombined = [Pcavitycube;Psphere];
Create an alphaShape
object representing the cube with the spherical cavity.
shpCubeWithSphericalCavity = alphaShape(Pcombined(:,1), ... Pcombined(:,2), ... Pcombined(:,3)); figure plot(shpCubeWithSphericalCavity,'FaceAlpha',0.4) title('alphaShape: Cube with Spherical Cavity')
Recover the triangulation that defines the domain of the alphaShape
object.
[tri,loc] = alphaTriangulation(shpCubeWithSphericalCavity);
Create a PDE model.
modelCube = createpde;
Create a geometry from the mesh and import the geometry and the mesh into the model.
[gCube,mshCube] = geometryFromMesh(modelCube,loc',tri');
Plot the resulting geometry.
figure pdegplot(modelCube,'FaceAlpha',0.5,'CellLabels','on') title('PDEModel: Cube with Spherical Cavity')
Create tetrahedral elements to form a solid sphere by using the spherical shell and adding a new node at the center. First, obtain the spherical shell by extracting facets of the spherical boundary.
sphereFacets = boundaryFacets(mshCube,'Face',3); sphereNodes = findNodes(mshCube,'region','Face',3);
Add a new node at the center.
newNodeID = size(mshCube.Nodes,2) + 1;
Construct the tetrahedral elements by using each of the three nodes on the spherical boundary facets and the new node at the origin.
sphereTets = [sphereFacets; newNodeID*ones(1,size(sphereFacets,2))];
Create a model that combines the cube with the spherical cavity and a sphere.
model = createpde;
Create a vector that maps all mshCube
elements to cell 1, and all elements of the solid sphere to cell 2.
e2c = [ones(1,size(mshCube.Elements,2)), 2*ones(1,size(sphereTets,2))];
Add a new node at the center [0;0;0]
to the nodes of the cube with the cavity.
combinedNodes = [mshCube.Nodes,[0;0;0]];
Combine the element connectivity matrices.
combinedElements = [mshCube.Elements,sphereTets];
Create a two-cell geometry from the mesh.
[g,msh] = geometryFromMesh(model,combinedNodes,combinedElements,e2c); figure pdegplot(model,'FaceAlpha',0.5,'CellLabels','on') title('Solid Sphere in Cube')