This file is indexed.

/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