escript  Revision_
CrossDomainCoupler.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 #ifndef __SPECKLEY_CROSSDOMAINCOUPLER_H__
19 #define __SPECKLEY_CROSSDOMAINCOUPLER_H__
20 
21 #include <speckley/Brick.h>
22 #include <speckley/Rectangle.h>
23 
24 #include <ripley/Brick.h>
25 #include <ripley/Rectangle.h>
26 
27 namespace speckley {
28 
29 class RipleyCoupler {
30 public:
31  RipleyCoupler(const SpeckleyDomain *speck, const double s_dx[2], int rank);
32 
33 
34  void interpolate(escript::Data& target, const escript::Data& source) const;
35 private:
36  // a struct type to hold all the relevant info on the target domain
37  struct Ripley {
39  double dx[3];
40  dim_t NE[3];
41  dim_t mins[3];
42  dim_t maxs[3];
43  };
44  void calculateOrder2(int dim, double loc, double *results) const;
45  void calculateOrder3(int dim, double loc, double *results) const;
46  void calculateOrder4(int dim, double loc, double *results) const;
47  void calculateOrder5(int dim, double loc, double *results) const;
48  void calculateOrder6(int dim, double loc, double *results) const;
49  void calculateOrder7(int dim, double loc, double *results) const;
50  void calculateOrder8(int dim, double loc, double *results) const;
51  void calculateOrder9(int dim, double loc, double *results) const;
52  void calculateOrder10(int dim, double loc, double *results) const;
53 
54  void generateLocations(struct Ripley& r, double **positions) const;
55 
56  bool validInterpolation(escript::Data& target, const escript::Data& source,
57  const SpeckleyDomain *speck, const double *s_dx,
58  const ripley::RipleyDomain *other) const;
59  void calculate(struct Ripley& r, dim_t ex, dim_t ey, dim_t ez,
60  int oqx, int oqy, int oqz, double *out, const double *factor_x,
61  const double *factor_y, const double *factor_z,
62  const escript::Data& source) const;
63 
64  void shareWithNeighbours(bool lowerFirst, int hasLower, int hasUpper,
65  double *bottom, double *top, double *brecv, double *trecv,
66  int bSize, int tSize, int distance) const;
67 
68  void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const;
69 
70  void shareBrickXFaces(struct Ripley& r, int hasLower,
71  int hasUpper, int lower, int upper, escript::Data& target) const;
72  void shareBrickYFaces(struct Ripley& r, int hasLower,
73  int hasUpper, int lower, int upper, escript::Data& target) const;
74  void shareBrickZFaces(struct Ripley& r, int hasLower,
75  int hasUpper, int lower, int upper, escript::Data& target) const;
76 
77  void shareRectangleXEdges(struct Ripley& r, int hasLower,
78  int hasUpper, int lower, int upper, escript::Data& target) const;
79  void shareRectangleYEdges(struct Ripley& r, int hasLower,
80  int hasUpper, int lower, int upper, escript::Data& target) const;
81  //speckley info
82  const SpeckleyDomain *speck;
83  dim_t s_NE[3];
84  double s_dx[3];
85  int s_NX[3];
86  double speckley_origin[3];
87  int order;
88  int numQuads;
89 
90  //coupling info
91  bool hasLower[3];
92  bool hasUpper[3];
93 
94  //per interpolation
95  mutable int numComp;
96 
97 #ifdef ESYS_MPI
98  int rank;
99  MPI_Comm comm;
100 #endif
101 
102 };
103 
109 void interpolateAcross3D(escript::Data& target, const escript::Data& source,
110  const Brick *speck, const double s_dx[3], int rank,
111  MPI_Comm comm);
112 
113 bool probeInterpolationAcross(int fsType_source,
114  const escript::AbstractDomain& domain, int fsType_target, int dim);
115 
116 } // end of namespace speckley
117 
118 #endif // __SPECKLEY_CROSSDOMAINCOUPLER_H__
119 
speckley::lagrange_degree10_7
double lagrange_degree10_7(double xi)
Definition: lagrange_functions.h:268
speckley::RipleyCoupler::Ripley::dx
double dx[3]
Definition: CrossDomainCoupler.h:64
speckley::lagrange_degree9_3
double lagrange_degree9_3(double xi)
Definition: lagrange_functions.h:212
speckley::lagrange_degree10_3
double lagrange_degree10_3(double xi)
Definition: lagrange_functions.h:252
speckley::RipleyCoupler::shareBrickZFaces
void shareBrickZFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:752
MPI_Status
int MPI_Status
Definition: EsysMPI.h:44
speckley::lagrange_degree9_8
double lagrange_degree9_8(double xi)
Definition: lagrange_functions.h:232
speckley::RipleyCoupler::Ripley::mins
dim_t mins[3]
Definition: CrossDomainCoupler.h:66
speckley::RipleyCoupler::hasUpper
bool hasUpper[3]
Definition: CrossDomainCoupler.h:117
speckley::RipleyCoupler::s_dx
double s_dx[3]
Definition: CrossDomainCoupler.h:109
speckley::lagrange_degree8_2
double lagrange_degree8_2(double xi)
Definition: lagrange_functions.h:172
speckley::lagrange_degree10_1
double lagrange_degree10_1(double xi)
Definition: lagrange_functions.h:244
ripley::RipleyDomain::getMPIComm
MPI_Comm getMPIComm() const
returns the MPI communicator
Definition: ripley/src/RipleyDomain.h:170
speckley::RipleyCoupler::RipleyCoupler
RipleyCoupler(const SpeckleyDomain *speck, const double s_dx[2], int rank)
Definition: CrossDomainCoupler.cpp:45
speckley::SpeckleyDomain::getLocalCoordinate
virtual double getLocalCoordinate(dim_t index, int dim) const =0
returns the index'th coordinate value in given dimension for this rank
speckley::RipleyCoupler::speck
const SpeckleyDomain * speck
Definition: CrossDomainCoupler.h:107
speckley::lagrange_degree9_2
double lagrange_degree9_2(double xi)
Definition: lagrange_functions.h:208
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
speckley::lagrange_degree10_4
double lagrange_degree10_4(double xi)
Definition: lagrange_functions.h:256
speckley::lagrange_degree4_1
double lagrange_degree4_1(double xi)
Definition: lagrange_functions.h:64
speckley::RipleyCoupler::hasLower
bool hasLower[3]
Definition: CrossDomainCoupler.h:116
INDEX4
#define INDEX4(_X1_, _X2_, _X3_, _X4_, _N1_, _N2_, _N3_)
Definition: index.h:26
speckley::ripleyLocations
const double ripleyLocations[2]
Definition: CrossDomainCoupler.cpp:29
speckley::interpolateAcross3D
void interpolateAcross3D(escript::Data &target, const escript::Data &source, const Brick *speck, const double s_dx[3], int rank, MPI_Comm comm)
interpolates data given on source onto target where source and target are given on different domains
speckley::lagrange_degree4_2
double lagrange_degree4_2(double xi)
Definition: lagrange_functions.h:68
speckley::lagrange_degree8_0
double lagrange_degree8_0(double xi)
Definition: lagrange_functions.h:164
speckley::lagrange_degree8_1
double lagrange_degree8_1(double xi)
Definition: lagrange_functions.h:168
INDEX2
#define INDEX2(_X1_, _X2_, _N1_)
Definition: index.h:22
speckley::RipleyCoupler::calculateOrder7
void calculateOrder7(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:318
speckley::RipleyCoupler::calculateOrder9
void calculateOrder9(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:349
escript::Data::getDomain
const_Domain_ptr getDomain() const
Return the domain.
Definition: Data.h:486
speckley::RipleyCoupler::calculateOrder10
void calculateOrder10(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:366
ripley::RipleyDomain::getElementLength
virtual const double * getElementLength() const =0
returns the lengths of an element
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::lagrange_degree7_4
double lagrange_degree7_4(double xi)
Definition: lagrange_functions.h:148
speckley::lagrange_degree8_3
double lagrange_degree8_3(double xi)
Definition: lagrange_functions.h:176
speckley::RipleyCoupler::order
int order
Definition: CrossDomainCoupler.h:112
speckley::RipleyCoupler::shareBrickXFaces
void shareBrickXFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:551
speckley::lagrange_degree7_6
double lagrange_degree7_6(double xi)
Definition: lagrange_functions.h:156
speckley::lagrange_degree9_5
double lagrange_degree9_5(double xi)
Definition: lagrange_functions.h:220
speckley::lagrange_degree10_2
double lagrange_degree10_2(double xi)
Definition: lagrange_functions.h:248
speckley::lagrange_degree9_9
double lagrange_degree9_9(double xi)
Definition: lagrange_functions.h:236
ripley::Elements
Definition: Ripley.h:67
speckley::lagrange_degree5_2
double lagrange_degree5_2(double xi)
Definition: lagrange_functions.h:88
speckley::SpeckleyDomain::getOrder
int getOrder() const
returns the order of the domain
Definition: speckley/src/SpeckleyDomain.h:754
speckley::lagrange_degree5_0
double lagrange_degree5_0(double xi)
Definition: lagrange_functions.h:80
speckley::lagrange_degree2_2
double lagrange_degree2_2(double xi)
Definition: lagrange_functions.h:40
speckley::lagrange_degree8_8
double lagrange_degree8_8(double xi)
Definition: lagrange_functions.h:196
speckley::lagrange_degree6_4
double lagrange_degree6_4(double xi)
Definition: lagrange_functions.h:120
speckley::RipleyCoupler::calculateOrder2
void calculateOrder2(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:258
speckley::RipleyCoupler::Ripley
Definition: CrossDomainCoupler.h:62
speckley::lagrange_degree5_3
double lagrange_degree5_3(double xi)
Definition: lagrange_functions.h:92
speckley::lagrange_degree9_0
double lagrange_degree9_0(double xi)
Definition: lagrange_functions.h:200
speckley::lagrange_degree10_8
double lagrange_degree10_8(double xi)
Definition: lagrange_functions.h:272
speckley::lagrange_degree8_7
double lagrange_degree8_7(double xi)
Definition: lagrange_functions.h:192
speckley::lagrange_degree7_2
double lagrange_degree7_2(double xi)
Definition: lagrange_functions.h:140
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::lagrange_degree4_3
double lagrange_degree4_3(double xi)
Definition: lagrange_functions.h:72
speckley::RipleyCoupler::shareWithNeighbours
void shareWithNeighbours(bool lowerFirst, int hasLower, int hasUpper, double *bottom, double *top, double *brecv, double *trecv, int bSize, int tSize, int distance) const
Definition: CrossDomainCoupler.cpp:959
speckley::lagrange_degree9_6
double lagrange_degree9_6(double xi)
Definition: lagrange_functions.h:224
speckley::SpeckleyDomain::getNumSubdivisionsPerDim
virtual const int * getNumSubdivisionsPerDim() const =0
returns the number of spatial subdivisions in each dimension
speckley::lagrange_degree8_6
double lagrange_degree8_6(double xi)
Definition: lagrange_functions.h:188
escript::Data::getFunctionSpace
const FunctionSpace & getFunctionSpace() const
Return the function space.
Definition: Data.h:462
speckley::RipleyCoupler::getEdgeSpacing
void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const
Definition: CrossDomainCoupler.cpp:384
speckley::lagrange_degree7_3
double lagrange_degree7_3(double xi)
Definition: lagrange_functions.h:144
speckley::RipleyCoupler::calculateOrder4
void calculateOrder4(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:279
speckley::probeInterpolationAcross
bool probeInterpolationAcross(int fsType_source, const escript::AbstractDomain &domain, int fsType_target, int dim)
Definition: CrossDomainCoupler.cpp:31
speckley::RipleyCoupler::calculateOrder8
void calculateOrder8(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:333
ripley::RipleyDomain::getLength
virtual const double * getLength() const =0
returns the lengths of the domain
speckley::lagrange_degree5_4
double lagrange_degree5_4(double xi)
Definition: lagrange_functions.h:96
speckley
Definition: AbstractAssembler.cpp:18
speckley::RipleyCoupler::shareRectangleXEdges
void shareRectangleXEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:821
speckley::lagrange_degree6_6
double lagrange_degree6_6(double xi)
Definition: lagrange_functions.h:128
escript::Data
Data represents a collection of datapoints.
Definition: Data.h:63
ripley::RipleyDomain
RipleyDomain extends the AbstractContinuousDomain interface for the Ripley library and is the base cl...
Definition: ripley/src/RipleyDomain.h:114
speckley::RipleyCoupler::generateLocations
void generateLocations(struct Ripley &r, double **positions) const
Definition: CrossDomainCoupler.cpp:132
INDEX3
#define INDEX3(_X1_, _X2_, _X3_, _N1_, _N2_)
Definition: index.h:24
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:90
speckley::RipleyCoupler::Ripley::maxs
dim_t maxs[3]
Definition: CrossDomainCoupler.h:67
speckley::lagrange_degree5_1
double lagrange_degree5_1(double xi)
Definition: lagrange_functions.h:84
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
speckley::lagrange_degree2_1
double lagrange_degree2_1(double xi)
Definition: lagrange_functions.h:36
speckley::lagrange_degree10_10
double lagrange_degree10_10(double xi)
Definition: lagrange_functions.h:280
speckley::RipleyCoupler::calculateOrder3
void calculateOrder3(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:268
speckley::lagrange_degree6_2
double lagrange_degree6_2(double xi)
Definition: lagrange_functions.h:112
speckley::lagrange_degree7_0
double lagrange_degree7_0(double xi)
Definition: lagrange_functions.h:132
speckley::Brick
Brick is the 3-dimensional implementation of a SpeckleyDomain.
Definition: speckley/src/Brick.h:45
speckley::lagrange_degree7_7
double lagrange_degree7_7(double xi)
Definition: lagrange_functions.h:160
ripley::RipleyDomain::getNumSubdivisionsPerDim
virtual const int * getNumSubdivisionsPerDim() const =0
returns the number of spatial subdivisions in each dimension
speckley::RipleyCoupler::calculateOrder5
void calculateOrder5(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:291
speckley::lagrange_degree6_5
double lagrange_degree6_5(double xi)
Definition: lagrange_functions.h:124
speckley::lagrange_degree6_3
double lagrange_degree6_3(double xi)
Definition: lagrange_functions.h:116
speckley::lagrange_degree10_9
double lagrange_degree10_9(double xi)
Definition: lagrange_functions.h:276
speckley::lagrange_degree8_5
double lagrange_degree8_5(double xi)
Definition: lagrange_functions.h:184
speckley::SpeckleyDomain::getNumElementsPerDim
virtual const dim_t * getNumElementsPerDim() const =0
returns the number of elements per MPI rank in each dimension
speckley::lagrange_degree8_4
double lagrange_degree8_4(double xi)
Definition: lagrange_functions.h:180
speckley::SpeckleyDomain
SpeckleyDomain extends the AbstractContinuousDomain interface for the Speckley library and is the bas...
Definition: speckley/src/SpeckleyDomain.h:97
speckley::lagrange_degree7_5
double lagrange_degree7_5(double xi)
Definition: lagrange_functions.h:152
speckley::SpeckleyDomain::getMPIComm
MPI_Comm getMPIComm() const
returns the MPI communicator
Definition: speckley/src/SpeckleyDomain.h:150
speckley::lagrange_degree9_4
double lagrange_degree9_4(double xi)
Definition: lagrange_functions.h:216
speckley::RipleyCoupler::interpolate
void interpolate(escript::Data &target, const escript::Data &source) const
Definition: CrossDomainCoupler.cpp:452
ripley::RipleyDomain::getDim
virtual int getDim() const
returns the number of spatial dimensions of the domain
Definition: ripley/src/RipleyDomain.h:189
speckley::RipleyCoupler::shareRectangleYEdges
void shareRectangleYEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:899
speckley::lagrange_degree5_5
double lagrange_degree5_5(double xi)
Definition: lagrange_functions.h:100
speckley::RipleyCoupler::s_NX
int s_NX[3]
Definition: CrossDomainCoupler.h:110
speckley::lagrange_degree10_6
double lagrange_degree10_6(double xi)
Definition: lagrange_functions.h:264
speckley::lagrange_degree4_0
double lagrange_degree4_0(double xi)
Definition: lagrange_functions.h:60
speckley::lagrange_degree6_0
double lagrange_degree6_0(double xi)
Definition: lagrange_functions.h:104
speckley::Elements
Definition: Speckley.h:76
speckley::lagrange_degree3_0
double lagrange_degree3_0(double xi)
Definition: lagrange_functions.h:44
MPI_DOUBLE
#define MPI_DOUBLE
Definition: EsysMPI.h:46
speckley::lagrange_degree6_1
double lagrange_degree6_1(double xi)
Definition: lagrange_functions.h:108
SHARED
#define SHARED
Definition: CrossDomainCoupler.cpp:23
speckley::lagrange_degree10_0
double lagrange_degree10_0(double xi)
Definition: lagrange_functions.h:240
speckley::lagrange_degree3_2
double lagrange_degree3_2(double xi)
Definition: lagrange_functions.h:52
speckley::RipleyCoupler::numQuads
int numQuads
Definition: CrossDomainCoupler.h:113
speckley::lagrange_degree3_3
double lagrange_degree3_3(double xi)
Definition: lagrange_functions.h:56
ripley::RipleyDomain::getLocalCoordinate
virtual double getLocalCoordinate(index_t index, int dim) const =0
returns the index'th coordinate value in given dimension for this rank
speckley::lagrange_degree2_0
double lagrange_degree2_0(double xi)
Definition: lagrange_functions.h:32
MINE
#define MINE
Definition: CrossDomainCoupler.cpp:22
speckley::RipleyCoupler::validInterpolation
bool validInterpolation(escript::Data &target, const escript::Data &source, const SpeckleyDomain *speck, const double *s_dx, const ripley::RipleyDomain *other) const
Definition: CrossDomainCoupler.cpp:74
speckley::RipleyCoupler::calculate
void calculate(struct Ripley &r, dim_t ex, dim_t ey, dim_t ez, int oqx, int oqy, int oqz, double *out, const double *factor_x, const double *factor_y, const double *factor_z, const escript::Data &source) const
Definition: CrossDomainCoupler.cpp:408
escript::FunctionSpace::getTypeCode
int getTypeCode() const
Returns the function space type code.
Definition: FunctionSpace.cpp:94
speckley::SpeckleyDomain::getDim
virtual int getDim() const
returns the number of spatial dimensions of the domain
Definition: speckley/src/SpeckleyDomain.h:169
speckley::lagrange_degree9_7
double lagrange_degree9_7(double xi)
Definition: lagrange_functions.h:228
MPI_Comm
int MPI_Comm
Definition: EsysMPI.h:41
ripley::RipleyDomain::getNumFacesPerBoundary
virtual const dim_t * getNumFacesPerBoundary() const =0
returns the number of face elements in the order (left,right,bottom,top,[front,back]) on current MPI ...
speckley::lagrange_degree7_1
double lagrange_degree7_1(double xi)
Definition: lagrange_functions.h:136
speckley::RipleyCoupler::Ripley::domain
const ripley::RipleyDomain * domain
Definition: CrossDomainCoupler.h:63
speckley::RipleyCoupler::speckley_origin
double speckley_origin[3]
Definition: CrossDomainCoupler.h:111
escript::AbstractDomain
Base class for all escript domains.
Definition: AbstractDomain.h:62
speckley::lagrange_degree3_1
double lagrange_degree3_1(double xi)
Definition: lagrange_functions.h:48
speckley::RipleyCoupler::s_NE
dim_t s_NE[3]
Definition: CrossDomainCoupler.h:108
speckley::RipleyCoupler::Ripley::NE
dim_t NE[3]
Definition: CrossDomainCoupler.h:65
speckley::SpeckleyDomain::getNumFacesPerBoundary
virtual const dim_t * getNumFacesPerBoundary() const =0
returns the number of face elements in the order (left,right,bottom,top,[front,back]) on current MPI ...
speckley::lagrange_degree4_4
double lagrange_degree4_4(double xi)
Definition: lagrange_functions.h:76
ripley::RipleyDomain::getNumElementsPerDim
virtual const dim_t * getNumElementsPerDim() const =0
returns the number of elements per MPI rank in each dimension
speckley::RipleyCoupler::calculateOrder6
void calculateOrder6(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:304
speckley::SpeckleyException
SpeckleyException exception class.
Definition: SpeckleyException.h:42
speckley::lagrange_degree9_1
double lagrange_degree9_1(double xi)
Definition: lagrange_functions.h:204
THEIRS
#define THEIRS
Definition: CrossDomainCoupler.cpp:24
speckley::lagrange_degree10_5
double lagrange_degree10_5(double xi)
Definition: lagrange_functions.h:260
speckley::RipleyCoupler::numComp
int numComp
Definition: CrossDomainCoupler.h:120
speckley::SpeckleyDomain::getLength
virtual const double * getLength() const =0
returns the lengths of the domain
speckley::RipleyCoupler::shareBrickYFaces
void shareBrickYFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:668