This file is indexed.

/usr/include/dune/grid/uggrid/uglbgatherscatter.hh is in libdune-grid-dev 2.3.1-1.

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
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_UGLBGATHERSCATTER_HH
#define DUNE_UGLBGATHERSCATTER_HH

namespace Dune {

  /** \brief Gather/scatter methods for dynamic loadbalancing with UGGrid
   */
  class UGLBGatherScatter
  {
    class LBMessageBuffer
    {
    public:
      template <class DataType>
      void read(DataType& x)
      {
        count_--;
        memcpy(&x, data_ + count_*sizeof(DataType), sizeof(DataType));
        if (!count_)
          free(data_);
      }

      template <class DataType>
      void write(const DataType& x)
      {
        count_++;
        char* moreData_ = (char*)realloc(data_, count_*sizeof(DataType));
        if (moreData_)
          data_ = moreData_;
        memcpy(data_ + (count_-1)*sizeof(DataType), &x, sizeof(DataType));
      }

      LBMessageBuffer()
        : count_(0), data_(0)
      {}

    private:
      int count_;
      char* data_;
    };

  public:

    /** \brief Gather data before load balancing
     */
    template <int codim, class GridView, class DataHandle>
    static void gather(const GridView& gridView, DataHandle& dataHandle)
    {
      const int dim = GridView::dimension;

      // do nothing if nothing has to be done
      if (!dataHandle.contains(dim, codim))
        return;

      // write the data into a global vector on process 0
      // write the macrogrid index of each entity into the corresponding UG vector
      typedef typename GridView::template Codim<codim>::Iterator Iterator;
      Iterator it = gridView.template begin<codim>();
      const Iterator& endIt = gridView.template end<codim>();
      for (; it != endIt; ++it) {
        int numberOfParams = dataHandle.size(*it);
        if (!numberOfParams)
          continue;

        // obtain data from DUNE handle and write it into the UG message buffer
        LBMessageBuffer lbMessageBuffer;
        dataHandle.gather(lbMessageBuffer, *it);

        char*& buffer = gridView.grid().getRealImplementation(*it).getTarget()->message_buffer;
        assert(not buffer);

        typedef typename DataHandle::DataType DataType;
        buffer = (char*)malloc(sizeof(int) + numberOfParams*sizeof(DataType));
        *((int*)buffer) = numberOfParams*sizeof(DataType);       // Size of the actual payload

        for (int paramIdx = 0; paramIdx < numberOfParams; paramIdx++)
        {
          DataType *dataPointer = (DataType*)(buffer + sizeof(int) + paramIdx*sizeof(DataType));
          lbMessageBuffer.read(*dataPointer);
        }
      }
    }

    /** \brief Scatter data after load balancing
     */
    template <int codim, class GridView, class DataHandle>
    static void scatter(const GridView& gridView, DataHandle& dataHandle)
    {
      const int dim = GridView::dimension;

      // do nothing if nothing has to be done
      if (!dataHandle.contains(dim, codim))
        return;

      // obtain the data from the global vector with help of
      // the macro index and scatter it
      typedef typename GridView::template Codim<codim>::Iterator Iterator;
      Iterator it = gridView.template begin<codim>();
      const Iterator& endIt = gridView.template end<codim>();
      for (; it != endIt; ++it) {
        int numberOfParams = dataHandle.size(*it);
        if (!numberOfParams)
          continue;

        // get data from UG message buffer and write to DUNE message buffer
        char*& buffer = gridView.grid().getRealImplementation(*it).getTarget()->message_buffer;
        assert(buffer);

        LBMessageBuffer lbMessageBuffer;

        for(int paramIdx = 0; paramIdx < numberOfParams; paramIdx++)
        {
          typedef typename DataHandle::DataType DataType;
          DataType *dataPointer = (DataType*)(buffer + sizeof(int) + paramIdx*sizeof(DataType));
          lbMessageBuffer.write(*dataPointer);
        }

        // call the data handle with the message buffer
        dataHandle.scatter(lbMessageBuffer, *it, numberOfParams);

        // free object's local message buffer
        free (buffer);
        buffer = nullptr;
      }
    }
  };

} // namespace Dune

#endif