Toggle navigation
Documentation
Big picture
The finite element method
The data structure
Not-so-quick guide
Optimisation
Order of action functions
Example codes and tutorials
List of example codes and tutorials
Meshing
Solvers
MPI parallel processing
Post-processing/visualisation
Other
Change log
Creating documentation
Coding conventions
Index
FAQ
Installation
Installation guide
Copyright
About
People
Contact/Get involved
Publications
Acknowledgements
Picture show
Go
src
generic
communicator.cc
Go to the documentation of this file.
1
// LIC// ====================================================================
2
// LIC// This file forms part of oomph-lib, the object-oriented,
3
// LIC// multi-physics finite-element library, available
4
// LIC// at http://www.oomph-lib.org.
5
// LIC//
6
// LIC// Copyright (C) 2006-2024 Matthias Heil and Andrew Hazel
7
// LIC//
8
// LIC// This library is free software; you can redistribute it and/or
9
// LIC// modify it under the terms of the GNU Lesser General Public
10
// LIC// License as published by the Free Software Foundation; either
11
// LIC// version 2.1 of the License, or (at your option) any later version.
12
// LIC//
13
// LIC// This library is distributed in the hope that it will be useful,
14
// LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
// LIC// Lesser General Public License for more details.
17
// LIC//
18
// LIC// You should have received a copy of the GNU Lesser General Public
19
// LIC// License along with this library; if not, write to the Free Software
20
// LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21
// LIC// 02110-1301 USA.
22
// LIC//
23
// LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24
// LIC//
25
// LIC//====================================================================
26
// Functions for OomphCommunicator
27
28
// MPI headers
29
#ifdef OOMPH_HAS_MPI
30
#include "mpi.h"
31
#endif
32
33
// Oomph-lib error handler
34
#include "
communicator.h
"
35
#include "
matrices.h
"
36
37
namespace
oomph
38
{
39
#ifdef OOMPH_HAS_MPI
40
41
//=============================================================================
42
/// A broadcast function for DenseMatrix<double>
43
//=============================================================================
44
void
OomphCommunicator::broadcast(
const
int
& source, DenseMatrix<double>& x)
45
{
46
// Get number of entries on processor source (where the matrix exists)
47
unsigned
nrow, ncol;
48
if
(this->my_rank() == source)
49
{
50
nrow = x.nrow();
51
if
(nrow > 0)
52
{
53
ncol = x.ncol();
54
}
55
else
56
{
57
ncol = 0;
58
}
59
}
60
61
// Broadcast to everybody how many entries to expect
62
MPI_Bcast(&nrow, 1, MPI_UNSIGNED_LONG, source, this->mpi_comm());
63
MPI_Bcast(&ncol, 1, MPI_UNSIGNED_LONG, source, this->mpi_comm());
64
65
if
(ncol != 0 && nrow != 0)
66
{
67
// convert into a C-style array
68
double
* x_bcast =
new
double
[nrow * ncol];
69
70
if
(this->my_rank() == source)
71
for
(
unsigned
long
i
= 0;
i
< nrow;
i
++)
72
{
73
for
(
unsigned
long
j = 0; j < ncol; j++)
74
{
75
x_bcast[
i
* ncol + j] = x(
i
, j);
76
}
77
}
78
79
// broadcast the array
80
MPI_Bcast(x_bcast, ncol * nrow, MPI_DOUBLE, source, this->mpi_comm());
81
82
// Now convert back into matrix (everywhere apart from source)
83
if
(this->my_rank() != source)
84
{
85
x.resize(nrow, ncol);
86
for
(
unsigned
long
i
= 0;
i
< nrow;
i
++)
87
for
(
unsigned
long
j = 0; j < ncol; j++)
88
{
89
x(
i
, j) = x_bcast[
i
* ncol + j];
90
}
91
}
92
// delete C-style array
93
delete
[] x_bcast;
94
}
95
else
96
{
97
x.resize(0, 0);
98
}
99
}
100
101
#endif
102
103
}
// namespace oomph
i
cstr elem_len * i
Definition:
cfortran.h:603
communicator.h
matrices.h
oomph
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
Definition:
advection_diffusion_elements.cc:30