/usr/include/libmesh/centroid_partitioner.h is in libmesh-dev 0.7.1-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | // $Id: centroid_partitioner.h 3874 2010-07-02 21:57:26Z roystgnr $
// The libMesh Finite Element Library.
// Copyright (C) 2002-2008 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#ifndef __centroid_partitioner_h__
#define __centroid_partitioner_h__
// C++ includes
#include <utility> // pair
#include <vector>
// Local includes
#include "partitioner.h"
#include "point.h"
namespace libMesh
{
// Forward declarations
class Elem;
/**
* The centroid partitioner partitions simply based on the
* locations of element centroids. You must define what
* you mean by "less than" for the list of element centroids, e.g.
* if you only care about distance in the z-direction, you would
* define "less than" differently than if you cared about radial
* distance.
*
* @author John W. Peterson and Benjamin S. Kirk, 2003
*/
// CentroidPartitioner class definition
class CentroidPartitioner : public Partitioner
{
public:
/**
* A typedef which is reserved only for use within
* this class. If \p X is chosen, then centroid locations
* will be sorted according to their X-location, etc...
*/
enum CentroidSortMethod {X=0,
Y,
Z,
RADIAL,
INVALID_METHOD};
/**
* Constructor. Takes the \p CentroidSortMethod to use, which
* defaults to \p X ordering.
*/
CentroidPartitioner (const CentroidSortMethod sm=X) : _sort_method(sm) {}
/**
* Creates a new partitioner of this type and returns it in
* an \p AutoPtr.
*/
virtual AutoPtr<Partitioner> clone () const {
AutoPtr<Partitioner> cloned_partitioner
(new CentroidPartitioner(sort_method()));
return cloned_partitioner;
}
/**
* Specifies how the elements will be sorted.
*/
CentroidSortMethod sort_method () const { return _sort_method; }
/**
* Change how the elements will be sorted.
*/
void set_sort_method (const CentroidSortMethod sm) {_sort_method = sm; }
protected:
/**
* Partitions the mesh into n subdomains. This is
* a required interface for the class.
*/
virtual void _do_partition (MeshBase& mesh,
const unsigned int n);
private:
/**
* Computes a list of element centroids for the mesh.
* This list will be kept around in case a repartition
* is desired.
*/
void compute_centroids (MeshBase& mesh);
/**
* Partition the list of centroids based on the
* x-coordinate of the centroid. This provides
* a function which may be passed to the std::sort
* routine for sorting the elements by centroid.
*/
static bool sort_x (const std::pair<Point, Elem*>& lhs,
const std::pair<Point, Elem*>& rhs);
/**
* Partition the list of centroids based on the
* y-coordinate of the centroid. This provides
* a function which may be passed to the std::sort
* routine for sorting the elements by centroid.
*/
static bool sort_y (const std::pair<Point, Elem*>& lhs,
const std::pair<Point, Elem*>& rhs);
/**
* Partition the list of centroids based on the
* z-coordinate of the centroid. This provides
* a function which may be passed to the std::sort
* routine for sorting the elements by centroid.
*/
static bool sort_z (const std::pair<Point, Elem*>& lhs,
const std::pair<Point, Elem*>& rhs);
/**
* Partition the list of centroids based on the
* radial position of the centroid. This provides
* a function which may be passed to the std::sort
* routine for sorting the elements by centroid.
*/
static bool sort_radial (const std::pair<Point, Elem*>& lhs,
const std::pair<Point, Elem*>& rhs);
/**
* Store a flag which tells which type of
* sort method we are using.
*/
CentroidSortMethod _sort_method;
/**
* Vector which holds pairs of centroids and
* their respective element pointers.
*/
std::vector<std::pair<Point, Elem*> > _elem_centroids;
};
} // namespace libMesh
#endif
|