DOLFIN
DOLFIN C++ interface
Loading...
Searching...
No Matches
LocalMeshValueCollection.h
1// Copyright (C) 2008-2012 Garth N. Wells
2//
3// This file is part of DOLFIN.
4//
5// DOLFIN is free software: you can redistribute it and/or modify
6// it under the terms of the GNU Lesser General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// DOLFIN is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU Lesser General Public License for more details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
17//
18// Modified by Anders Logg, 2008-2009.
19//
20// First added: 2008-11-28
21// Last changed: 2011-03-25
22//
23// Modified by Anders Logg, 2008-2009.
24// Modified by Kent-Andre Mardal, 2011.
25
26
27#ifndef __LOCAL_MESH_VALUE_COLLECTION_H
28#define __LOCAL_MESH_VALUE_COLLECTION_H
29
30#include <map>
31#include <utility>
32#include <vector>
33#include <dolfin/common/MPI.h>
34#include <dolfin/log/log.h>
35
36namespace dolfin
37{
38
39 template <typename T> class MeshValueCollection;
40
43
44 template <typename T>
46 {
47 public:
48
51 std::size_t dim);
52
55
57 std::size_t dim () const
58 { return _dim; }
59
61 const std::vector<std::pair<std::pair<std::size_t,
62 std::size_t>, T> >& values() const
63 { return _values; }
64
65 private:
66
67 // Topological dimension
68 const std::size_t _dim;
69
70 // MeshValueCollection values (cell_index, local_index), value))
71 std::vector<std::pair<std::pair<std::size_t, std::size_t>, T> > _values;
72
73 // MPI communicator
74 dolfin::MPI::Comm _mpi_comm;
75
76 };
77
78 //---------------------------------------------------------------------------
79 // Implementation of LocalMeshValueCollection
80 //---------------------------------------------------------------------------
81 template <typename T>
83 const MeshValueCollection<T>& values,
84 std::size_t dim)
85 : _dim(dim), _mpi_comm(comm)
86 {
87 // Prepare data
88 std::vector<std::vector<std::size_t> > send_indices;
89 std::vector<std::vector<T> > send_v;
90
91 // Extract data on main process and split among processes
92 if (MPI::is_broadcaster(_mpi_comm.comm()))
93 {
94 // Get number of processes
95 const std::size_t num_processes = MPI::size(_mpi_comm.comm());
96 send_indices.resize(num_processes);
97 send_v.resize(num_processes);
98
99 const std::map<std::pair<std::size_t, std::size_t>, T>& vals
100 = values.values();
101 for (std::size_t p = 0; p < num_processes; p++)
102 {
103 const std::pair<std::size_t, std::size_t> local_range
104 = MPI::local_range(_mpi_comm.comm(), p, vals.size());
105 typename std::map<std::pair<std::size_t,
106 std::size_t>, T>::const_iterator it = vals.begin();
107 std::advance(it, local_range.first);
108 for (std::size_t i = local_range.first; i < local_range.second; ++i)
109 {
110 send_indices[p].push_back(it->first.first);
111 send_indices[p].push_back(it->first.second);
112 send_v[p].push_back(it->second);
113 std::advance(it, 1);
114 }
115 }
116 }
117
118 // Scatter data
119 std::vector<std::size_t> indices;
120 std::vector<T> v;
121 MPI::scatter(_mpi_comm.comm(), send_indices, indices);
122 MPI::scatter(_mpi_comm.comm(), send_v, v);
123 dolfin_assert(2*v.size() == indices.size());
124
125 // Unpack
126 for (std::size_t i = 0; i < v.size(); ++i)
127 {
128 const std::size_t cell_index = indices[2*i];
129 const std::size_t local_entity_index = indices[2*i + 1];
130 const T value = v[i];
131 _values.push_back({{cell_index, local_entity_index}, value});
132 }
133 }
134 //---------------------------------------------------------------------------
135
136}
137
138#endif
Definition LocalMeshValueCollection.h:46
const std::vector< std::pair< std::pair< std::size_t, std::size_t >, T > > & values() const
Return data.
Definition LocalMeshValueCollection.h:62
std::size_t dim() const
Return dimension of cell entity.
Definition LocalMeshValueCollection.h:57
LocalMeshValueCollection(MPI_Comm comm, const MeshValueCollection< T > &values, std::size_t dim)
Create local mesh data for given LocalMeshValueCollection.
Definition LocalMeshValueCollection.h:82
~LocalMeshValueCollection()
Destructor.
Definition LocalMeshValueCollection.h:54
Definition MPI.h:77
MPI_Comm comm() const
Return the underlying MPI_Comm object.
Definition MPI.cpp:117
static bool is_broadcaster(MPI_Comm comm)
Definition MPI.cpp:166
static void scatter(MPI_Comm comm, const std::vector< std::vector< T > > &in_values, std::vector< T > &out_value, unsigned int sending_process=0)
Scatter vector in_values[i] to process i.
Definition MPI.h:499
Definition SubDomain.h:35
Definition adapt.h:30