forked from idaholab/moose
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LibmeshPartitioner.C
129 lines (117 loc) · 4.67 KB
/
LibmeshPartitioner.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/****************************************************************/
/* DO NOT MODIFY THIS HEADER */
/* MOOSE - Multiphysics Object Oriented Simulation Environment */
/* */
/* (c) 2010 Battelle Energy Alliance, LLC */
/* ALL RIGHTS RESERVED */
/* */
/* Prepared by Battelle Energy Alliance, LLC */
/* Under Contract No. DE-AC07-05ID14517 */
/* With the U. S. Department of Energy */
/* */
/* See COPYRIGHT for full restrictions */
/****************************************************************/
#include "LibmeshPartitioner.h"
#include "libmesh/linear_partitioner.h"
#include "libmesh/centroid_partitioner.h"
#include "libmesh/parmetis_partitioner.h"
#include "libmesh/metis_partitioner.h"
#include "libmesh/hilbert_sfc_partitioner.h"
#include "libmesh/morton_sfc_partitioner.h"
template<>
InputParameters validParams<LibmeshPartitioner>()
{
InputParameters params = validParams<MoosePartitioner>();
MooseEnum partitioning("metis=-2 parmetis=-1 linear=0 centroid hilbert_sfc morton_sfc");
params.addRequiredParam<MooseEnum>("partitioner", partitioning, "Specifies a mesh partitioner to use when splitting the mesh for a parallel computation.");
MooseEnum direction("x y z radial");
params.addParam<MooseEnum>("centroid_partitioner_direction", direction, "Specifies the sort direction if using the centroid partitioner. Available options: x, y, z, radial");
return params;
}
LibmeshPartitioner::LibmeshPartitioner(const InputParameters & params) :
MoosePartitioner(params),
_partitioner_name(getParam<MooseEnum>("partitioner"))
{
switch (_partitioner_name)
{
case -2: // metis
_partitioner = new MetisPartitioner;
break;
case -1: // parmetis
_partitioner = new ParmetisPartitioner;
break;
case 0: // linear
_partitioner = new LinearPartitioner;
break;
case 1: // centroid
{
if (!isParamValid("centroid_partitioner_direction"))
mooseError("If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
MooseEnum direction = getParam<MooseEnum>("centroid_partitioner_direction");
if (direction == "x")
_partitioner = new CentroidPartitioner(CentroidPartitioner::X);
else if (direction == "y")
_partitioner = new CentroidPartitioner(CentroidPartitioner::Y);
else if (direction == "z")
_partitioner = new CentroidPartitioner(CentroidPartitioner::Z);
else if (direction == "radial")
_partitioner = new CentroidPartitioner(CentroidPartitioner::RADIAL);
break;
}
case 2: // hilbert_sfc
_partitioner = new HilbertSFCPartitioner;
break;
case 3: // morton_sfc
_partitioner = new MortonSFCPartitioner;
break;
}
}
LibmeshPartitioner::~LibmeshPartitioner()
{
}
UniquePtr<Partitioner>
LibmeshPartitioner::clone() const
{
switch (_partitioner_name)
{
case -2: // metis
return UniquePtr<Partitioner>(new MetisPartitioner);
break;
case -1: // parmetis
return UniquePtr<Partitioner>(new ParmetisPartitioner);
break;
case 0: // linear
return UniquePtr<Partitioner>(new LinearPartitioner);
break;
case 1: // centroid
{
if (!isParamValid("centroid_partitioner_direction"))
mooseError("If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
MooseEnum direction = getParam<MooseEnum>("centroid_partitioner_direction");
if (direction == "x")
return UniquePtr<Partitioner>(new CentroidPartitioner(CentroidPartitioner::X));
else if (direction == "y")
return UniquePtr<Partitioner>(new CentroidPartitioner(CentroidPartitioner::Y));
else if (direction == "z")
return UniquePtr<Partitioner>(new CentroidPartitioner(CentroidPartitioner::Z));
else if (direction == "radial")
return UniquePtr<Partitioner>(new CentroidPartitioner(CentroidPartitioner::RADIAL));
break;
}
case 2: // hilbert_sfc
return UniquePtr<Partitioner>(new HilbertSFCPartitioner);
break;
case 3: // morton_sfc
return UniquePtr<Partitioner>(new MortonSFCPartitioner);
break;
}
// this cannot happen but I need to trick the compiler into
// believing me
mooseError("Error in LibmeshPartitioner: Supplied partitioner option causes error in clone()");
return UniquePtr<Partitioner>(new MetisPartitioner);
}
void
LibmeshPartitioner::_do_partition(MeshBase & mesh, const unsigned int n)
{
_partitioner->_do_partition(mesh, n);
}