escript  Revision_
Coupler.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2020 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14 * Development from 2019 by School of Earth and Environmental Sciences
15 **
16 *****************************************************************************/
17 
18 
19 /****************************************************************************/
20 
21 /* Paso: coupler */
22 
23 /****************************************************************************/
24 
25 /* Author: Lutz Gross, l.gross@uq.edu.au */
26 
27 /****************************************************************************/
28 
29 #ifndef __PASO_COUPLER_H__
30 #define __PASO_COUPLER_H__
31 
32 #include "Paso.h"
33 #include "PasoException.h"
34 #include "SharedComponents.h"
35 
36 namespace paso {
37 
38 struct Connector;
39 typedef boost::shared_ptr<Connector> Connector_ptr;
40 typedef boost::shared_ptr<const Connector> const_Connector_ptr;
41 
42 template<typename Scalar> struct Coupler;
43 template<typename T> using Coupler_ptr = boost::shared_ptr<Coupler<T> >;
44 template<typename T> using const_Coupler_ptr = boost::shared_ptr<const Coupler<T> >;
45 
47 struct Connector
48 {
51 
53  {
54  if (s->local_length != r->local_length) {
55  throw PasoException("Connector: local length of send and recv "
56  "SharedComponents must match.");
57  }
58  send = s;
59  recv = r;
60  }
61 
63  inline Connector_ptr copy() const { return unroll(1); }
64 
65  inline Connector_ptr unroll(index_t block_size) const
66  {
67  SharedComponents_ptr new_send_shcomp, new_recv_shcomp;
68  Connector_ptr out;
69  if (block_size > 1) {
70  new_send_shcomp.reset(new SharedComponents(send->local_length,
71  send->neighbour, send->shared, send->offsetInShared,
72  block_size, 0));
73 
74  new_recv_shcomp.reset(new SharedComponents(recv->local_length,
75  recv->neighbour, recv->shared, recv->offsetInShared,
76  block_size, 0));
77  } else {
78  new_send_shcomp = send;
79  new_recv_shcomp = recv;
80  }
81  out.reset(new Connector(new_send_shcomp, new_recv_shcomp));
82  return out;
83  }
84 
85  //inline debug() const
86  //{
87  // for (int i=0; i<recv->neighbour.size(); ++i)
88  // printf("Coupler: %d receive %d data at %d from %d\n",
89  // s->mpi_info->rank,recv->offsetInShared[i+1]-recv->offsetInShared[i],
90  // recv->offsetInShared[i],recv->neighbour[i]);
91  // for (int i=0; i<send->neighbour.size(); ++i)
92  // printf("Coupler: %d send %d data at %d to %d\n",
93  // s->mpi_info->rank,send->offsetInShared[i+1]-send->offsetInShared[i],
94  // send->offsetInShared[i],send->neighbour[i]);
95  //}
96 };
97 
98 
99 template<typename Scalar>
100 struct Coupler
101 {
102  Coupler(const_Connector_ptr, dim_t blockSize, escript::JMPI mpiInfo);
103  ~Coupler();
104 
105  void startCollect(const Scalar* in);
107  void copyAll(Coupler_ptr<Scalar> target) const;
108  void fillOverlap(dim_t n, Scalar* x);
109  void max(dim_t n, Scalar* x);
110 
111  inline const Scalar* borrowLocalData() const { return data; }
112 
113  inline const Scalar* borrowRemoteData() const { return recv_buffer; }
114 
115  inline dim_t getNumSharedComponents() const
116  {
117  return connector->send->numSharedComponents;
118  }
119 
120  inline dim_t getNumOverlapComponents() const
121  {
122  return connector->recv->numSharedComponents;
123  }
124 
125  inline dim_t getNumSharedValues() const
126  {
128  }
129 
130  inline dim_t getNumOverlapValues() const
131  {
133  }
134 
135  inline dim_t getLocalLength() const
136  {
137  return connector->send->local_length;
138  }
139 
142  bool in_use;
143 
144  // unmanaged pointer to data to be sent
145  Scalar* data;
151 };
152 
153 
154 } // namespace paso
155 
156 #endif // __PASO_COUPLER_H__
157 
speckley::Brick::gradient_order3
void gradient_order3(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:96
MPI_Status
int MPI_Status
Definition: EsysMPI.h:44
paso::Coupler::block_size
dim_t block_size
Definition: Coupler.h:153
paso::Connector::recv
SharedComponents_ptr recv
Definition: Coupler.h:62
speckley::Brick::reduction_order2
void reduction_order2(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:37
speckley::Brick::integral_order2
void integral_order2(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:37
speckley::Brick::gradient_order2
void gradient_order2(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:37
escript::DataTypes::real_t
double real_t
type of all real-valued scalars in escript
Definition: DataTypes.h:76
paso::const_Coupler_ptr
boost::shared_ptr< const Coupler< T > > const_Coupler_ptr
Definition: Coupler.h:56
paso::Coupler::borrowLocalData
const Scalar * borrowLocalData() const
Definition: Coupler.h:123
speckley::Brick::reduction_order10
void reduction_order10(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:246
paso::Coupler::getNumSharedValues
dim_t getNumSharedValues() const
Definition: Coupler.h:137
speckley::Brick::gradient_order6
void gradient_order6(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:280
paso::Coupler::borrowRemoteData
const Scalar * borrowRemoteData() const
Definition: Coupler.h:125
paso::Coupler::copyAll
void copyAll(Coupler_ptr< Scalar > target) const
Definition: Coupler.cpp:143
escript::Data::requireWrite
void requireWrite()
Ensures data is ready for write access. This means that the data will be resolved if lazy and will be...
Definition: Data.cpp:1243
paso::const_Connector_ptr
boost::shared_ptr< const Connector > const_Connector_ptr
Definition: Coupler.h:52
INDEX4
#define INDEX4(_X1_, _X2_, _X3_, _X4_, _N1_, _N2_, _N3_)
Definition: index.h:26
speckley::Brick::gradient_order10
void gradient_order10(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:542
paso::Coupler::getNumOverlapValues
dim_t getNumOverlapValues() const
Definition: Coupler.h:142
speckley::Brick::reduction_order4
void reduction_order4(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:90
speckley::Brick::gradient_order7
void gradient_order7(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:344
escript::Data::getSampleDataRO
const DataTypes::real_t * getSampleDataRO(DataTypes::RealVectorType::size_type sampleNo, DataTypes::real_t dummy=0) const
Return the sample data for the given sample no. Please do not use this unless you NEED to access samp...
Definition: Data.h:1988
speckley::Brick::integral_order6
void integral_order6(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:154
speckley::Brick::integral_order5
void integral_order5(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:125
speckley::Brick::gradient_order4
void gradient_order4(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:155
speckley::Brick::integral_order3
void integral_order3(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:67
paso::Coupler::connector
const_Connector_ptr connector
Definition: Coupler.h:152
speckley::Brick::reduction_order3
void reduction_order3(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:64
paso::Coupler::send_buffer
Scalar * send_buffer
Definition: Coupler.h:158
paso::SharedComponents
Definition: SharedComponents.h:53
paso::Connector::copy
Connector_ptr copy() const
creates a copy
Definition: Coupler.h:75
INDEX5
#define INDEX5(_X1_, _X2_, _X3_, _X4_, _X5_, _N1_, _N2_, _N3_, _N4_)
Definition: index.h:28
escript::Data::getDataPointSize
int getDataPointSize() const
Return the size of the data point. It is the product of the data point shape dimensions.
Definition: Data.cpp:1364
speckley::Brick::integral_order4
void integral_order4(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:96
paso::Coupler::mpi_info
escript::JMPI mpi_info
Definition: Coupler.h:162
speckley::Brick::integral_order7
void integral_order7(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:183
speckley
Definition: AbstractAssembler.cpp:18
paso::Coupler::startCollect
void startCollect(const Scalar *in)
Definition: Coupler.cpp:78
paso::Coupler::mpi_stati
MPI_Status * mpi_stati
Definition: Coupler.h:161
Paso.h
escript::Data
Data represents a collection of datapoints.
Definition: Data.h:63
paso::Coupler::Coupler
Coupler(const_Connector_ptr, dim_t blockSize, escript::JMPI mpiInfo)
Definition: Coupler.cpp:42
INDEX3
#define INDEX3(_X1_, _X2_, _X3_, _N1_, _N2_)
Definition: index.h:24
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:90
escript::JMPI
boost::shared_ptr< JMPI_ > JMPI
Definition: EsysMPI.h:71
escript::Data::getSampleDataRW
DataTypes::real_t * getSampleDataRW(DataTypes::RealVectorType::size_type sampleNo, DataTypes::real_t dummy=0)
Return the sample data for the given sample no. Please do not use this unless you NEED to access samp...
Definition: Data.h:1953
paso::Coupler_ptr
boost::shared_ptr< Coupler< T > > Coupler_ptr
Definition: Coupler.h:55
speckley::Brick::gradient_order8
void gradient_order8(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:409
speckley::Brick::reduction_order7
void reduction_order7(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:168
paso::Coupler::max
void max(dim_t n, Scalar *x)
paso::Coupler::finishCollect
Scalar * finishCollect()
Definition: Coupler.cpp:126
paso::Coupler::getNumSharedComponents
dim_t getNumSharedComponents() const
Definition: Coupler.h:127
speckley::Brick::integral_order8
void integral_order8(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:212
paso::Coupler::mpi_requests
MPI_Request * mpi_requests
Definition: Coupler.h:160
paso::Coupler::~Coupler
~Coupler()
Definition: Coupler.cpp:67
paso::SharedComponents_ptr
boost::shared_ptr< SharedComponents > SharedComponents_ptr
Definition: SharedComponents.h:48
paso::Coupler::in_use
bool in_use
Definition: Coupler.h:154
SharedComponents.h
speckley::Brick::integral_order9
void integral_order9(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:241
paso::Connector::unroll
Connector_ptr unroll(index_t block_size) const
Definition: Coupler.h:77
speckley::Brick::m_dx
double m_dx[3]
grid spacings / cell sizes of domain
Definition: speckley/src/Brick.h:383
MPI_DOUBLE
#define MPI_DOUBLE
Definition: EsysMPI.h:46
paso::Coupler::getNumOverlapComponents
dim_t getNumOverlapComponents() const
Definition: Coupler.h:132
speckley::Brick::gradient_order9
void gradient_order9(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:475
paso::PasoException
PasoException exception class.
Definition: PasoException.h:45
paso::Coupler::recv_buffer
Scalar * recv_buffer
Definition: Coupler.h:159
speckley::Brick::integral_order10
void integral_order10(std::vector< Scalar > &, const escript::Data &) const
Definition: BrickIntegrals.cpp:270
escript::DataTypes::index_t
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:85
speckley::Brick::m_NE
dim_t m_NE[3]
number of elements for this rank in each dimension including shared
Definition: speckley/src/Brick.h:389
speckley::Brick::gradient_order5
void gradient_order5(escript::Data &, const escript::Data &) const
Definition: BrickGradients.cpp:217
paso::Coupler::data
Scalar * data
Definition: Coupler.h:157
PASO_DLL_API
#define PASO_DLL_API
Definition: Paso.h:59
speckley::Brick::reduction_order5
void reduction_order5(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:116
paso::Coupler::fillOverlap
void fillOverlap(dim_t n, Scalar *x)
Definition: Coupler.cpp:161
paso::Connector::send
SharedComponents_ptr send
Definition: Coupler.h:61
speckley::Brick::reduction_order6
void reduction_order6(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:142
MPI_Request
int MPI_Request
Definition: EsysMPI.h:42
PasoException.h
paso::Connector_ptr
boost::shared_ptr< Connector > Connector_ptr
Definition: Coupler.h:50
escript::Data::actsExpanded
bool actsExpanded() const
Return true if this Data is expanded or resolves to expanded. That is, if it has a separate value for...
Definition: Data.cpp:1122
Coupler.h
paso
Definition: BiCGStab.cpp:26
escript::DataTypes::cplx_t
std::complex< real_t > cplx_t
complex data type
Definition: DataTypes.h:79
escript::Scalar
Data Scalar(double value, const FunctionSpace &what, bool expanded)
A collection of factory functions for creating Data objects which contain data points of various shap...
Definition: DataFactory.cpp:62
paso::Connector::Connector
Connector(SharedComponents_ptr s, SharedComponents_ptr r)
Definition: Coupler.h:64
speckley::Brick::reduction_order9
void reduction_order9(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:220
paso::Coupler::getLocalLength
dim_t getLocalLength() const
Definition: Coupler.h:147
speckley::Brick::reduction_order8
void reduction_order8(const escript::Data &, escript::Data &) const
Definition: BrickReductions.cpp:194