Select Git revision
t21.geo 3.25 KiB
// -----------------------------------------------------------------------------
//
// Gmsh GEO tutorial 21
//
// Mesh partitioning
//
// -----------------------------------------------------------------------------
// Gmsh can partition meshes using different algorithms, e.g. the graph
// partitioner Metis or the `SimplePartition' plugin. For all the partitining
// algorithms, the relationship between mesh elements and mesh partitions is
// encoded through the creation of new (discrete) elementary entities, called
// "partition entities".
//
// Partition entities behave exactly like other discrete elementary entities;
// the only difference is that they keep track of both a mesh partition index
// and their parent elementary entity.
//
// The major advantage of this approach is that it allows to maintain a full
// boundary representation of the partition entities, which Gmsh creates
// automatically if `Mesh.PartitionCreateTopology' is set.
// Let us start by creating a simple geometry with two adjacent squares sharing
// an edge:
SetFactory("OpenCASCADE");
Rectangle(1) = {0, 0, 0, 1, 1};
Rectangle(2) = {1, 0, 0, 1, 1};
BooleanFragments{ Surface{1}; Delete; }{ Surface{2}; Delete; }
MeshSize {:} = 0.05;
// We create one physical group for each square, and we mesh the resulting
// geometry:
Physical Surface("Left", 100) = 1;
Physical Surface("Right", 200) = 2;
Mesh 2;
// We now define several constants to fine-tune how the mesh will be partitioned
DefineConstant[
partitioner = {0, Choices{0="Metis", 1="SimplePartition"},
Name "Parameters/0Mesh partitioner"}
N = {3, Min 1, Max 256, Step 1,
Name "Parameters/1Number of partitions"}
topology = {1, Choices{0, 1},
Name "Parameters/2Create partition topology (BRep)?"}
ghosts = {0, Choices{0, 1},
Name "Parameters/3Create ghost cells?"}
physicals = {0, Choices{0, 1},
Name "Parameters/3Create new physical groups?"}
write = {1, Choices {0, 1},
Name "Parameters/3Write file to disk?"}
split = {0, Choices {0, 1},
Name "Parameters/4Write one file per partition?"}
];
// Should we create the boundary representation of the partition entities?
Mesh.PartitionCreateTopology = topology;
// Should we create ghost cells?
Mesh.PartitionCreateGhostCells = ghosts;
// Should we automatically create new physical groups on the partition entities?
Mesh.PartitionCreatePhysicals = physicals;
// Should we keep backward compatibility with pre-Gmsh 4, e.g. to save the mesh
// in MSH2 format?
Mesh.PartitionOldStyleMsh2 = 0;
// Should we save one mesh file per partition?
Mesh.PartitionSplitMeshFiles = split;
If (partitioner == 0)
// Use Metis to create N partitions
PartitionMesh N;
// Several options can be set to control Metis: `Mesh.MetisAlgorithm' (1:
// Recursive, 2: K-way), `Mesh.MetisObjective' (1: min. edge-cut, 2:
// min. communication volume), `Mesh.PartitionTriWeight' (weight of
// triangles), `Mesh.PartitionQuadWeight' (weight of quads), ...
Else
// Use the `SimplePartition' plugin to create chessboard-like partitions
Plugin(SimplePartition).NumSlicesX = N;
Plugin(SimplePartition).NumSlicesY = 1;
Plugin(SimplePartition).NumSlicesZ = 1;
Plugin(SimplePartition).Run;
EndIf
// Save mesh file (or files, if `Mesh.PartitionSplitMeshFiles' is set):
If(write)
Save "t21.msh";
EndIf